{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "9yupXUk1DKOe"
   },
   "source": [
    "# MNIST from scratch\n",
    "\n",
    "This notebook walks through an example of training a TensorFlow model to do digit classification using the [MNIST data set](http://yann.lecun.com/exdb/mnist/). MNIST is a labeled set of images of handwritten digits.\n",
    "\n",
    "An example follows."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2016-09-16T14:49:20.863031",
     "start_time": "2016-09-16T14:49:20.818734"
    },
    "cellView": "both",
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0
     },
     "output_extras": [
      {}
     ]
    },
    "colab_type": "code",
    "collapsed": false,
    "id": "sbUKaF8_uDI_",
    "outputId": "67a51332-3aea-4c29-8c3d-4752db08ccb3"
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAMYAAABFCAYAAAARv5krAAAYl0lEQVR4Ae3dV4wc1bYG4D3YYJuc\nc8455yCSSIYrBAi4EjriAZHECyAk3rAID1gCIXGRgIvASIQr8UTmgDA5imByPpicTcYGY+yrbx+t\nOUWpu2e6u7qnZ7qXVFPVVbv2Xutfce+q7hlasmTJktSAXrnn8vR/3/xXmnnadg1aTfxL3/7rwfSP\nmT+kf/7vf098YRtK+FnaZaf/SS++OjNNathufF9caiT2v/xxqbTGki/SXyM1nODXv/r8+7Tb+r+l\nnxZNcEFHEG/e3LnpoINXSh/PWzxCy/F9eWjOnDlLrr/++jR16tQakgylqdOWTZOGFqX5C/5IjXNL\njdt7/NTvv/+eTjnllLT//vunr776Kl100UVpueWWq8n10lOmpSmTU5o/f0Fa3DDH1ry9p0/++eef\naZ999slYYPS0005LK664Yk2eJ02ekqZNnZx+XzA/LfprYgGxePHitOqqq6YZM2akyfPmzUvXXXdd\nHceoic2EOckxDj300CzPggUL0g033NC3OKy00krDer3pppv6FgcBIjvGUkv9u5paZZVVhoHpl4Mv\nv/wyhfxDQ0NZ7H7EQbacPHny39Tejzj88ccfacqUKRmHEecYf0Nr8GGAQJ8gMHCMPlH0QMzmEBg4\nRnN4DVr3CQIDx+gTRQ/EbA6BgWM0h9egdZ8g8PeliD4RutfF/Ouvfz9OtZy8aNGiNH/+/GGWl112\n2XzseYuVNKtqsaI23Ghw0DYCA8doG8JqO+AUG2+8cVq4cGHaY4890vLLL5/WXXfdfI6jvPDCC3lJ\n8amnnkoezP3000/pl19+GThHtWpIPekYomTxFS7HnkqKjMsss0yGgFE4r62tSBFVJ02aNPyconi9\nV4/JwzHwT9ZNNtkkeZ6w5ZZbph133DH99ttv6ccff8zXX3nllcRRnHNfv2cNGMQWGRaOrWbUrjsG\nBRLAA6U4Lhoqw9h2223ztRBq6aWXzsbgvueffz4Lu9NOO2UnYTgrr7xy7tO9nOH111/Pbb744ov0\nww8/jAvngAdFMvQDDjggG/0GG2yQX1GZNm1aziCCwzrrrJPl3muvvXKwePnll9M333wzHDCKWPbL\nMbuAkfISjnvvvXcW/emnn85lqCBqa4a65hiYR/Gk2RNGRlwm3n7ggQfmdrKD9sqJtdZaKxvCnDlz\n8n3Tp09PXmPYeuutc0SVNQjvnmuvvTa3efzxx9N33303PGZ5rF75DBvvqq233nrp22+/TWeddVby\nikpgxCE4vQDhlQUBRfDw2esbs2fPTquvvnqviNN1PuIdJ4GErVx44YUZowsuuCB9+umn6eeff84B\nspmsWqljhPFDxjGGYx/lDkN33udajCoVlAjRzl4U8LjefRwnPjsXG8OJqKBd8NB1LTU5IHyCd7LJ\nGOYXNoGjFqaGIKtrERDIDKtukfGMH/zRZa1A101+YBF44KfMYzO8VOYYjDWiukiGqc022yyXOUqd\nzTffPJ/z1ialeqNVxA9gi0wzlOJ5juJlR8JeddVV+ZrIKTq4ZvJp/8EHH+SU+txzz+W2SqmxVFZR\nplrH5DTRXmGFFdKuu+6azjjjjOzosl5g6D54CQCI4mGjhNQO5occckh2LvLTA6fqJOEnyhU6kNlk\nZmUuvrtNcFx77bUzhsZWXgoSsm6t4Dsa/tp2DErCmA04HAI4FLjaaqtlBhmnSKiNY4rDtHZFB6jF\nMMH0RVDH+nCPYxtDCFJnKkniRbDitWjTK3sykQUuMLPn3DZGX8SFnCG/fVyz5zCCBtIHTLshdzif\n8fERn8cKXxjCNOwCTu3Qf6yqhV4AQokiP489//zzM0DxnQYKwqAtIkko1kQzFFxvaNcJ6u3Pe+65\nJ/cRRvDee+9lA2BInIyRff/997nNO++8k7t0vl2A6vHWynmyiPJ43WKLLbIijz/++LTddtvlTCdz\nwIWSg9yjxBJ0GN/DDz+c7zv77LOzbEceeWSekwVGgsOsWbNyNo0+qt7DfPvtt8/dmtvIGnPnzk3P\nPPPMsJ6rHrNef/BBeJA90RprrJEDcNhctMkXR/mnbccwuCjNGTbaaKMc8TBZprITxOdgOvbuKxqG\nz6LSJ598kseJ9Gi1CYmSv/76a3YyJZWMZJ6Ceskp8EMusihFEAyUmVaa8G2rxTNHIrd733///eH7\nYeaLNe5xrEzlWNF/HqQDf0Tm+GIbvYdD43MsKAIo/JDgE0G5aFfN8NaWYxiUshikqGYTTUSt0TCk\njXsYNqJQQso+rgGa0vX58ccf56hQTtk+48F92rmvlnE1A0on2uKP0Yrw+Nxzzz0zn+ZhjKwRXq6v\nueaa2TmUiRQfS7SyNeMks9IV9vrvJOl/q622yo4Mfw5Pvm6TMclLdit6shh+YAMnq1E29tEsteUY\nBgMSgxa5MOAzJZcVXQs4bUR8XxhCHIwzMALCBuCcx5q0tF3u133l8XrRMchFiRYNyMxBKM/5IjZl\nWVzjULKwACISytIWFsi56aab5mvOKyEikmdAO/iHY+BDCRUZuoPD1e1akECyLseA7d13352DhdKa\nk8Cmlt3U7TSl9p58FwejYK8ncAwKpDTnGDcARbWiAUjHiNEHsITSPlagpEZChcfrZzwSOfBOiQwX\nLuR3PjAhtwAD08iAMCO/a+5xPTIm3ALjwERf0V+c69QeT7ZujVdLDhgKBrANXAMreMESRkU7rdVP\nrXNtZ4xIpSLH1VdfnR3j4IMPzkbw2Wefpa+//jovo5188slZsZjArAcvFP3YY4+lSy+9NEdTdTTy\n0I5xHHfccfm1CH2LtuORKEqmkwVlVU+sBY+IdJRmE0zeeOONnEXuu+++7AhnnnlmWn/99XMJ5brt\nzTffzHMJx/o555xzkgdb0U8rRtAKrnTYqtG1Ml6teyxInHDCCdlGYByBmG2Z97ChVvFo2zEwbHCR\nTbqP7EDxPjN2pUBEe86AXAcsg+f10TYMSTvnRM1ulQe1wG/nHEXZZEJZUIYQ5cgWMsEgMgqclFdk\ndh+MbFFyuddnWMLNfTYkcuuXHlBkpFYNI3dS+mMMfCHHsZWadfUjmQVn8iLywscG21apMscQwR55\n5JEM3KuvvpoZ5LHOmzgjAvBwzFt2/Oijj3Lm4Ayin/MU/eGHH+b2N998c/5MGSaZ44nw7OEd5Rx7\n7LE5+1EehYXxkpes5li2K6+8Mhv8Lrvsko381ltvzcEBfvHQKh5auk9GPvHEE3NJAx+/eKL/HXbY\nIQcbK3nwN067xAk4s5VHdbvsx0nxrYQeKxJMZAfBA7GlRx99NC9EtCN7JY4RoPBeAHIAyrB3jpHY\nwqu1d02d7HpZcfqINo5dL7eJMXtxTzk2sgWFM/gcsnCakI2cFOk+523O+Qw7WaeYHYpYRp9xn4Bk\nbPdWSfgJXYYM+ne+2xRj2sdx8EDu8rm4Ntp9pY4RSmb0CIPOAVNGoLA47yU4S2xen37ppZdy9CkL\nE/3lm8bJHzJbbiavt2Q9p7AkK7oyXAZOLk7gs9c4PJC0AOE8DDyrgJkaWgYQkSPYuAdpWySfteU8\nHhqKouYq+io6ZfGeZo7xpbT1+jt+jGULfprpq922ePHMBibwjWVq523KVrzBsIzTaMeu1DFi0HI0\nYyyYtAekY5MltbRyihFJiROBKIYTwMCTWJNubwdQFCXFapK9z96mtbjgs3thFKWnUgjBzNZIya5F\nOyUcPG36q4LwRgZ6Ix8HtBk3tirGGU0feAkslHfk5PzBh2cXSkvtWqWOOEaRGcoSHdXDMoYn1tK8\nyaON0ahbCWgFS/vxSnjn5F4ItLeiFAGAzCKc7MDA1OlIjc4pLFKE7FEyxb5ZPNTbtuiv2fvrtddf\nOFsYXcwj8d8qv/XGq3femLvvvnvOvrIYPPEjG+PDseDbDnXcMXiyiGiyyACOPvrovN95552zV3/+\n+ef5zVveznlEo6CICvG5l/d4JSvHP+qoo7JjKDs4PkVSGPm9HSz9W5rlPEoCQYHjVFXyRGnBOcKA\n28VOP/qTBWX6YnS2IKB8qYL/enyGHPbKziOOOCLj6sGeslGW8L6Y4ANr2MY99fpsdL7jjmFwkSTS\nr6gDVCk+tmDQedcJ5LgdwaLPbu7xjJRRNlErSsiQhVHJlOEQoh182o1wRTnharwYs3itnWP9Rd/R\nD5mLW5yveh/YRhYMjItyBh/wjPat8tEVx6B00RKo5513XpIl7rzzzuwEourMmTOz95uIcyBfTSXY\niy++mCOrSFS1klsFrNZ9eGPoJtmeyRx00EE5cpGbIi21XnbZZbkMee2117KMHIKMIVcotVb/vXoO\nz6I0+URoMlVFcBFE7L1+IjNYIo6v/fo+D3tC+FCR+FHuwNUCgfOtUlccI5hnJMoIBhN1sBICqMoN\nNaLP3pkiFGciIIBC4HaEbRWk0dyHb3Mp/EY0I6+NsytvyKxsKhpQr8ozGpm1IZ8IbV+PyllGuyh1\nYBXXOQEcy6R8M5eAHzuxxX3GRvbaCKJ4aRfXrjkG5jEbk00Prxi8SZTJKmc5/PDDc5v99tsvC+hB\njWtqStmD0F4Ma1foMvDtfqZMUc3/lYjMSFFW3NS7JtyyoKzSiTocHoFJHMc+MlK7Mta7n9NbATJe\nrbEYvQWIWCVitIyaXrV3nsG7H2Y2GVcbxyj6NX+waKEPmOvbfShwtjhQDDz5Ygt/uuoY+OPtnICD\nEMBTWsAQUu0NBBsDEgFEWOADAiDaVRERWsCq5i34IRN+TbTJgn8KwzOFuR4KDUXW7Kyik53Ep8w/\n+RkxWeO5S1EM5wVABguXMGp69dk1x87D0ObdL32GHI5tsDQGHtwbm/Hw4TpnKvNY5Ge0x113DEwT\n3tIsIdSnDIfxcxJAevCHfE9cXcmotHXfAw88kIFUdgFjLMn4HuZRuh9FExmjRCCnZxRqcPxz8ioU\nVk9eRhJkPAYHV8ZVFRkjjFSfAtw222yTy2OZ0iv15fHcQ4dKaMcwsBdEEL26RzaIh5+yK7LSBGPn\no8yOZX+vzRhfXzZ8cRrtyzzkzpr803XHwB8wTJYIRol+VY8zqMMBbP0f+cExE1qTdbU7x3jwwQdz\nVBYdesExKNiEWx2MfwoOAyCbJ9uRHZvUTcPmsENhGNE4HBKOHKNqZzQu3KNfX9H1nRABQZlbNkpt\n4SNo4DWIIesDj9qYnwki2giWqol3330348kZLPm7xvi1Pffcc7MzhA3gy/0oeIuxWtmPiWNgNCIF\nYwcCAa2FA1ikJZz1aeUVsBmge9TyoqGoIqKUFdEKCFXcU0/pHJizVMUnXBiBh6IicdTTzsEOnuZk\nDE/2rcJI4KMf/TF+0TucwDhkZ+DGL4/nGkPGV/AIC+2RvfP6ZPTI4gu5XNM/Um7RPzuIFyn1zW7w\npQ9UHj+fbOHPmDlGCOGBGIeQQfwuq0jnISBQfOHft7JEHN94Q5xF6XLFFVfkyKIEGyuiGAo3r6BI\nx0imcM6k+6GHHspOEQbcDq+UTl4BwRu7PstUiPEJFsa9/PLL83nXg6d2xnUvoxS5L7744uGyh/wy\nRpRF9YwSHsHjE088kWWADQeRFThZkTgBstensZG5h4m56oEdcAp9CwTOVUlj6hgECcGBpA6XDaze\niLKhVABQAhKB3cNxbEAL4KoEppm+gjf3OMafDf+UW7zeTL/ltqIiAxBMOIIxnLOHgbFsMGQ4InhE\n0nJfrXw2hnIRD3SFBKmYWDfqE49woFvOzZno3NxM0HDciMjBDsjEBgLTsJHYN+qjmWtj7hjBLKFF\nQgL7qRz14jHHHJPBcC2M3wRPVDT5ohzZRv0Z16O/sdozAKmdopUH5kftTrzJpl+lk29CcgpLw3Bg\npMbwwqF/S80pGJ6xO0WM+8Ybbxw2TuOEoTYakwyovB/JKdzDMVQOHvCRzXju890fL11aGhcMqqIx\ndwwCRkYQDZAaE7lWBhyosQEmQM439MgffDHm0Si8EcuBC0ezcQSZVKYktzFEW+3sfQ4natRvu9eM\nTS9F7IvHo+m/2fb6LNuCc0WsW+mzHq9j6hgE9YCHp5tkez2EAVjlMOmyUlU2Lis8ygVR0rykyolt\nPZCaOY9fr32Qp50X6xi7pWCGbsHBvwLgGIcddljGxvcsjOU1GseyiKjJQWydpiqNsBlei85BfhNx\neJunVCl31x0jBOMAjJ9jRC3OEERDS7QMI0qQohIYgLSq7FJuMZbi9WZA7kRbvFAWx5Dyy449mjED\nG/dyDPW4VSiy2iNvBcCSUdxyyy35OYHrqJUx843j8I/qQpA074BVVdR1x+AIHCIiIGewsqIuds41\ntSSlOxeOFHuOQ/E+2zPEuFYVKM32U3RMvGy44YbZMTg2B2+GOIXXJcjpR9lkUy/QyZ7GUU8zAD9R\nCiuR0oQYVv1IMAk7qFL+rjkGg7GZQPLufffdN69QKJtkCAKKjNGu1p7gMgWDYEDRpkpAmu0rnMLe\nhie/RavcI49Sr1ZW0w6V91ac/IsxmdHPB0U5pQ+4+TExDudNUhPufnaKIn7N6m2k9h11jKLRqP+U\nQJb2eHh4uYjK0LW1D0MpCq0NR4g24RTR/0hCdvM6/m14FtljeTL4D/liedFeO7LYcyh7eMGDY8X1\n6IM8Vp9kWjj2GwWG5IZb2FKVOHTMMTCvDKBgD2Z22223bNynnnpqVrZXBFxjQDZUFJiwIqKHN8qH\nO+64IxvN/fffn9vG/VWC0UpfeC5uZMEbg/ctM/8SzYOxZ599Nhs4ebSx0ECpcDFvMCdRggkesoQ+\nzaHU0N4EgAEnue2227JTON+LgaEVDFu5h+w2Wdl33GFkEUIQqYIqdYwwbJGO8q2xOydqUiTFWpJV\nPzsuUwhlzzFETxlGdFSCqaMB4XwvUzgKWU3AyW4uwFns4QMbilUyxbq8p/4cw3UEB8FDGQUDx/ac\nqB8zRS2dw5qthe3VatPKucocg6JiYu3lP2nfawvekKVITzgJQLH24QTBtPZeE2D89957b27jwZ1I\nwIm8R2OMWHmJ+3pxTzaK8l+HyMrgTzrppMxqOIEsGoZvz0nsyWiliRMUl2G9aOk6POyLZVUvYtBp\nniL4wA1m9lVSW46BOQqKpTLK9FnUsxftvW4swssa4dkhCGFCMNfcp08lhM9KKc4h0obgsa8ShHb6\nCv5DJnu8IwHB9TB852DkOlzIRV6kXbSVMfQj48BWdhE0TLr1Fe3zQR/+gRMK5yjuq4KjZccQ2SlY\njexHmCnSkiLjtsesmlnpQ5naFo1A5GMAHoJxBI709ttv54ygntZWmWEcQMS9VQleRT9kNmfAG0P3\nHRPGbHnVudg4gEyJOAYiE0wikHAAcxHyxndO4KI/WHEK/Qzo7wjAXfaFNdurikaNtIERRTqmYIYd\nE2tGEs8hfJ8iFB/3xV67MCjG8NZbb6Unn3wyC+XfDxfnDxFp496qhK6qn5CDA5twK/fIRH5Gb0MM\nOhxCFgkKjOBoHqKEkmWvueaanG04iTHcP3CKQO0/e3ZhgceP2smqcKyKRuUYlEKhPDL+d5z1c4qV\nFTDnmBIZMwZ9DiKAzTmvCetPNFR7W7fXXt/KLddqTcyjr17bRybkEF5XiQhPHnMuDlF07MCB3I49\nl4EDxTrnfsFBJBxQbQSKeGoROqjdurWzIzoGJqRxS2KUf/rpp2flcRDRjRKVCdpFhCwz7rOVKE5z\n++235/7uuuuuXDq5P5yKEY0np8B3TKb9K1/vLTF0/7MiJtyRPYrq4fx+7R2e7vFDDzDyfx1goPwc\nUGMEYG/rFI3oGAYW0UUyimQIcRwGzbgpVsZAUTYE065xCtc5GUeSHTyg4kzKs/FKoSBljyhvTz6y\n2gseZAwlwgI+cNBGtpV9ZRj4BobjFY9O8g0bQcXWaRpxBE5hHuFnJ0XB6dOn56ge2QGDlK2dFSSG\n4b8kxVzEdSWGVxgYQLzrxJkIGgbTaUE73b9MZ/KNfIMOJpdcckndYZWmFAwv+wgydW/o8wsCK3xn\nz56dFzx8oxPGtk7QiI5h0FBaeGzRKYIpjDN2ig6lB9OiprmI60qNieIMIXvsQy7yotjH9eI+2hbP\nDY4bI8D+2JdnWTYY+iwDs78qaUTHEM0sI1pClAVMnqX9ImGQszB6DHoNOLzZNZlGRlEq9JNB9JOs\nRXvoxDGnsDTudwFUHTNmzMjDqEaU9xYvGgWiZnka0TEo16CeNyCM1SLtwmt5cNEoCOUa5xjQAIFW\nEGBP5rbKdTRr1qwcfGUMthXVTCt917pnRMdwE6ZiQm0JckADBMYCgWLwtXjTSeq/d5Y7ieag7wmD\nwMAxJowqB4JUicDAMapEc9DXhEFgcjxcM7vvR4on7bHS1q84WNkpUr/iEL+aOLRw4cIlQCmuIhUB\nmsjHlpQ9c7EmzjEsN1vd6DeCg8UVT+qRd7b6EQey8wMT+6El8RSu36xhIO8AgQYI9F94bADG4NIA\ngUDg/wHX+3lgThDIegAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from __future__ import print_function\n",
    "\n",
    "from IPython.display import Image\n",
    "import base64\n",
    "Image(data=base64.decodestring(\"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\".encode('utf-8')), embed=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "J0QZYD_HuDJF"
   },
   "source": [
    "We're going to be building a model that recognizes these digits as 5, 0, and 4.\n",
    "\n",
    "# Imports and input data\n",
    "\n",
    "We'll proceed in steps, beginning with importing and inspecting the MNIST data. This doesn't have anything to do with TensorFlow in particular -- we're just downloading the data archive."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2016-09-16T14:49:20.958307",
     "start_time": "2016-09-16T14:49:20.864840"
    },
    "cellView": "both",
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0
     },
     "output_extras": [
      {}
     ]
    },
    "colab_type": "code",
    "collapsed": false,
    "executionInfo": {
     "elapsed": 110,
     "status": "ok",
     "timestamp": 1446749124399,
     "user": {
      "color": "#1FA15D",
      "displayName": "Michael Piatek",
      "isAnonymous": false,
      "isMe": true,
      "permissionId": "00327059602783983041",
      "photoUrl": "//lh6.googleusercontent.com/-wKJwK_OPl34/AAAAAAAAAAI/AAAAAAAAAlk/Rh3u6O2Z7ns/s50-c-k-no/photo.jpg",
      "sessionId": "716a6ad5e180d821",
      "userId": "106975671469698476657"
     },
     "user_tz": 480
    },
    "id": "w5vKZqr6CDz9",
    "outputId": "794eac6d-a918-4888-e8cf-a8628474d7f1"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Successfully downloaded train-images-idx3-ubyte.gz 9912422 bytes.\n",
      "Successfully downloaded train-labels-idx1-ubyte.gz 28881 bytes.\n",
      "Successfully downloaded t10k-images-idx3-ubyte.gz 1648877 bytes.\n",
      "Successfully downloaded t10k-labels-idx1-ubyte.gz 4542 bytes.\n"
     ]
    }
   ],
   "source": [
    "import os\n",
    "from six.moves.urllib.request import urlretrieve\n",
    "\n",
    "SOURCE_URL = 'http://yann.lecun.com/exdb/mnist/'\n",
    "WORK_DIRECTORY = \"/tmp/mnist-data\"\n",
    "\n",
    "def maybe_download(filename):\n",
    "    \"\"\"A helper to download the data files if not present.\"\"\"\n",
    "    if not os.path.exists(WORK_DIRECTORY):\n",
    "        os.mkdir(WORK_DIRECTORY)\n",
    "    filepath = os.path.join(WORK_DIRECTORY, filename)\n",
    "    if not os.path.exists(filepath):\n",
    "        filepath, _ = urlretrieve(SOURCE_URL + filename, filepath)\n",
    "        statinfo = os.stat(filepath)\n",
    "        print('Successfully downloaded', filename, statinfo.st_size, 'bytes.')\n",
    "    else:\n",
    "        print('Already downloaded', filename)\n",
    "    return filepath\n",
    "\n",
    "train_data_filename = maybe_download('train-images-idx3-ubyte.gz')\n",
    "train_labels_filename = maybe_download('train-labels-idx1-ubyte.gz')\n",
    "test_data_filename = maybe_download('t10k-images-idx3-ubyte.gz')\n",
    "test_labels_filename = maybe_download('t10k-labels-idx1-ubyte.gz')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "gCtMhpIoC84F"
   },
   "source": [
    "## Working with the images\n",
    "\n",
    "Now we have the files, but the format requires a bit of pre-processing before we can work with it. The data is gzipped, requiring us to decompress it. And, each of the images are grayscale-encoded with values from [0, 255]; we'll normalize these to [-0.5, 0.5].\n",
    "\n",
    "Let's try to unpack the data using the documented format:\n",
    "\n",
    "    [offset] [type]          [value]          [description] \n",
    "    0000     32 bit integer  0x00000803(2051) magic number \n",
    "    0004     32 bit integer  60000            number of images \n",
    "    0008     32 bit integer  28               number of rows \n",
    "    0012     32 bit integer  28               number of columns \n",
    "    0016     unsigned byte   ??               pixel \n",
    "    0017     unsigned byte   ??               pixel \n",
    "    ........ \n",
    "    xxxx     unsigned byte   ??               pixel\n",
    "    \n",
    "Pixels are organized row-wise. Pixel values are 0 to 255. 0 means background (white), 255 means foreground (black).\n",
    "\n",
    "We'll start by reading the first image from the test data as a sanity check."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2016-09-16T14:49:22.112407",
     "start_time": "2016-09-16T14:49:20.960204"
    },
    "cellView": "both",
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0
     },
     "output_extras": [
      {}
     ]
    },
    "colab_type": "code",
    "collapsed": false,
    "executionInfo": {
     "elapsed": 57,
     "status": "ok",
     "timestamp": 1446749125010,
     "user": {
      "color": "#1FA15D",
      "displayName": "Michael Piatek",
      "isAnonymous": false,
      "isMe": true,
      "permissionId": "00327059602783983041",
      "photoUrl": "//lh6.googleusercontent.com/-wKJwK_OPl34/AAAAAAAAAAI/AAAAAAAAAlk/Rh3u6O2Z7ns/s50-c-k-no/photo.jpg",
      "sessionId": "716a6ad5e180d821",
      "userId": "106975671469698476657"
     },
     "user_tz": 480
    },
    "id": "P_3Fm5BpFMDF",
    "outputId": "c8e777e0-d891-4eb1-a178-9809f293cc28"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "magic number 2051\n",
      "image count 10000\n",
      "rows 28\n",
      "columns 28\n",
      "First 10 pixels: [0 0 0 0 0 0 0 0 0 0]\n"
     ]
    }
   ],
   "source": [
    "import gzip, binascii, struct, numpy\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "with gzip.open(test_data_filename) as f:\n",
    "    # Print the header fields.\n",
    "    for field in ['magic number', 'image count', 'rows', 'columns']:\n",
    "        # struct.unpack reads the binary data provided by f.read.\n",
    "        # The format string '>i' decodes a big-endian integer, which\n",
    "        # is the encoding of the data.\n",
    "        print(field, struct.unpack('>i', f.read(4))[0])\n",
    "    \n",
    "    # Read the first 28x28 set of pixel values. \n",
    "    # Each pixel is one byte, [0, 255], a uint8.\n",
    "    buf = f.read(28 * 28)\n",
    "    image = numpy.frombuffer(buf, dtype=numpy.uint8)\n",
    "  \n",
    "    # Print the first few values of image.\n",
    "    print('First 10 pixels:', image[:10])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "7NXKCQENNRQT"
   },
   "source": [
    "The first 10 pixels are all 0 values. Not very interesting, but also unsurprising. We'd expect most of the pixel values to be the background color, 0.\n",
    "\n",
    "We could print all 28 * 28 values, but what we really need to do to make sure we're reading our data properly is look at an image."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2016-09-16T14:49:22.525418",
     "start_time": "2016-09-16T14:49:22.114324"
    },
    "cellView": "both",
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0
     },
     "output_extras": [
      {}
     ]
    },
    "colab_type": "code",
    "collapsed": false,
    "executionInfo": {
     "elapsed": 887,
     "status": "ok",
     "timestamp": 1446749126640,
     "user": {
      "color": "#1FA15D",
      "displayName": "Michael Piatek",
      "isAnonymous": false,
      "isMe": true,
      "permissionId": "00327059602783983041",
      "photoUrl": "//lh6.googleusercontent.com/-wKJwK_OPl34/AAAAAAAAAAI/AAAAAAAAAlk/Rh3u6O2Z7ns/s50-c-k-no/photo.jpg",
      "sessionId": "716a6ad5e180d821",
      "userId": "106975671469698476657"
     },
     "user_tz": 480
    },
    "id": "F_5w-cOoNLaG",
    "outputId": "77dabc81-e3ee-4fcf-ac72-88038494fb6c"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f2c38599110>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "\n",
    "# We'll show the image and its pixel value histogram side-by-side.\n",
    "_, (ax1, ax2) = plt.subplots(1, 2)\n",
    "\n",
    "# To interpret the values as a 28x28 image, we need to reshape\n",
    "# the numpy array, which is one dimensional.\n",
    "ax1.imshow(image.reshape(28, 28), cmap=plt.cm.Greys);\n",
    "\n",
    "ax2.hist(image, bins=20, range=[0,255]);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "weVoVR-nN0cN"
   },
   "source": [
    "The large number of 0 values correspond to the background of the image, another large mass of value 255 is black, and a mix of grayscale transition values in between.\n",
    "\n",
    "Both the image and histogram look sensible. But, it's good practice when training image models to normalize values to be centered around 0.\n",
    "\n",
    "We'll do that next. The normalization code is fairly short, and it may be tempting to assume we haven't made mistakes, but we'll double-check by looking at the rendered input and histogram again. Malformed inputs are a surprisingly common source of errors when developing new models."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2016-09-16T14:49:22.895369",
     "start_time": "2016-09-16T14:49:22.527595"
    },
    "cellView": "both",
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0
     },
     "output_extras": [
      {}
     ]
    },
    "colab_type": "code",
    "collapsed": false,
    "executionInfo": {
     "elapsed": 531,
     "status": "ok",
     "timestamp": 1446749126656,
     "user": {
      "color": "#1FA15D",
      "displayName": "Michael Piatek",
      "isAnonymous": false,
      "isMe": true,
      "permissionId": "00327059602783983041",
      "photoUrl": "//lh6.googleusercontent.com/-wKJwK_OPl34/AAAAAAAAAAI/AAAAAAAAAlk/Rh3u6O2Z7ns/s50-c-k-no/photo.jpg",
      "sessionId": "716a6ad5e180d821",
      "userId": "106975671469698476657"
     },
     "user_tz": 480
    },
    "id": "jc1xCZXHNKVp",
    "outputId": "bd45b3dd-438b-41db-ea8f-d202d4a09e63"
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgcAAAFkCAYAAAC0KZhSAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzt3XucZGV97/vPr2/Vl+nbXJgBAZEYyGgS47QXOAZjglvU\nEGJidmJHjls5xm0kHs9kJ16yTSC6YxI9YdgouN2JRwJq52VQTzQiqCReQATDKME4EpONguJcerq7\n+n5/9h9rPYtnrV5V3dVd1VXd/X2/XutV1VWrqp7pgVnf+j03c84hIiIi4jXVuwEiIiLSWBQORERE\nJEXhQERERFIUDkRERCRF4UBERERSFA5EREQkReFAREREUhQOREREJEXhQERERFIUDkRERCRF4UBk\nBzOzR8xsOed4b/x8wcxuNLNhM5sws9vM7IzMe5xjZp8xsykzO25m7zYz/dsisoXpf2CRne1ZwIHg\n+A+AAz4WP3898IvAy4HnA2cBH/cvjkPA7UALcBHwn4BXA+/YlNaLSE2YNl4SEc/Mrgde6py7wMx6\ngFPAK5xzn4yfvxA4BlzknLvfzF4CfAo40zk3HJ/zn4E/A/Y55xbr8gcRkQ1R5UBEADCzVuCVwAfj\nh55FVBG4y5/jnHsYeBS4OH7oIuAhHwxidwK9wNNr3WYRqY2WejdARBrGrxBd1P86/nk/MO+cG8+c\nd4KoC4L49kTO8/65B/M+yMz2AJcB3wNmN9RqkZ2tHTgPuNM5d7pab6pwICLeVcBnnXPHN+GzLgM+\nsgmfI7JTvBL4aLXeTOFARDCzc4EXAi8LHj4OtJlZT6Z6sD9+zp/z7Mzb7Q+eK+V7AB/+8Ic5ePDg\neptdNYcPH+bIkSP1bgagtpTTSO1plLYcO3aMK6+8EuL/p6pF4UBEIKoanCCaeeA9ACwClwLhgMRz\nga/G59wL/IGZ7Q3GHbwIKALfLvN5swAHDx7k0KFD1fozrFtvb29DtAPUlnIaqT2N1JZYVbvnFA5E\ndjgzM6Lphzc755b94865cTP7IHCdmY0CE8ANwD3Oua/Hp32OKATcamZvAc4E3gm8zzm3sIl/DBGp\nIoUDEXkhcA7woZznDgNLwG1AAbgDuNo/6ZxbNrPLgfcTVROmgJuBa2rbZBGpJYUDkR3OOfd5oLnE\nc3PAG+Oj1OsfAy6vTetEpB60zoGI7HiDg4P1bkJCbSmtkdrTSG2pBa2QKCKbzswOAQ888MADjTao\nS2RLOXr0KAMDAwADzrmj1XpfVQ5EREQkReFAREREUhQOREREJEXhQERERFI0lVFEtqTh4WEuv/xX\nOH48u+9T2hVXXM4NN1y3Sa0S2R4UDkRkS/rmN7/JfffdDbyOaDPJPPfzoQ99SOFApEIKByKyxb2N\naMfaPO+hxK7RIlKGxhyIiIhIisKBiIiIpCgciIiISIrCgYiIiKQoHIiIiEiKwoGIiIikKByIiIhI\nisKBiIiIpCgciIiISIrCgYiIiKQoHIiIiEiKwoGIiIikKByIiIhIisKBiIiIpCgciIiISIrCgYiI\niKQoHIiIiEiKwoGIiIikKByIiIhIisKBiIiIpCgciIiISIrCgYiIiKQoHIiIiEiKwoGIiIikKByI\n7HBmdpaZ3Wpmw2Y2bWYPmtmhzDnvMLPH4+c/b2ZPzTzfb2YfMbOimY2a2V+ZWdfm/klEpFoUDkR2\nMDPrA+4B5oDLgIPAfwFGg3PeAvwO8DrgOcAUcKeZtQVv9dH4tZcCvwg8H/jAJvwRRKQGWurdABGp\nq7cCjzrnXhs89v3MOW8C3umc+3sAM3sVcAJ4GfAxMztIFCwGnHPfiM95I/AZM/s959zxWv8hRKS6\nVDkQ2dl+CfgnM/uYmZ0ws6NmlgQFM3sKcAC4yz/mnBsH7gMujh+6CBj1wSD2BcABz631H0BEqk/h\nQGRnOx/4beBh4EXA+4EbzOz/jJ8/QHSRP5F53Yn4OX/OyfBJ59wSMBKcIyJbiLoVRHa2JuB+59wf\nxj8/aGY/CbweuLV+zRKRelI4ENnZfgQcyzx2DPjV+P5xwID9pKsH+4FvBOecEb6BmTUDu+PnSjp8\n+DC9vb2pxwYHBxkcHFz7n0BkhxgaGmJoaCj1WLFYrMlnKRyI7Gz3ABdmHruQeFCic+4RMztONAvh\nnwHMrIdoLMGN8fn3An1m9sxg3MGlRKHivnIffuTIEQ4dOlTuFBGJ5QXno0ePMjAwUPXPUjgQ2dmO\nAPeY2duAjxFd9F8L/FZwzvXA283s34DvAe8EfgD8HYBz7jtmdifwl2b220Ab8F5gSDMVRLammg1I\nNLOrzewRM5sxs6+Z2bNr9Vkisj7OuX8CfgUYBB4C/ivwJufc3wTnvJvoYv8BokpAB/AS59x88Fa/\nCXyHaJbC3wNfBv7zZvwZRKT6alI5MLPfAP6CaNGU+4HDRIumXOCcG86cu4dojvT3gNlatEdkB2kH\nzgPudM6dXssLnHO3A7evcs61wLVlnh8DrlxrI0WksdWqW+Ew8AHn3C0AZvZ6olXTrgLenTn3MuAj\nNWqHyE71SqJVC0VEKlb1cGBmrcAA8C7/mHPOmdkXeGLRlND3AD784Q9z8OBBIBrBfOTIkWo3bcMa\nsV2N2CZQuypVrXYdO3aMK6+8EuL/r0RE1qMWlYO9QDP5i6ZkR0VD3JVw8ODBZNRyb29vQ45gbsR2\nNWKbQO2qVA3apS46EVk3rZAoIiIiKbWoHAwDS0SLpIT2U2ZBlHAxlPvvv58rrrhCi6GIlLGZC6KI\nyM5S9XDgnFswsweIFkH5FICZWfzzDaVeFy6GcsUVV/CpT32q2k0T2VY2c0EUEdlZajVb4Trg5jgk\n+KmMncDNa3lxo1YLGrFdjdgmULsq1ajtEpGdqSbhwDn3MTPbC7yDqDvhm8BlzrlTa3l9o/5D2Yjt\nasQ2gdpVqUZtl4jsTDVbPtk5dxNwU63eX0RERGpDsxVEREQkReFAREREUhQOREREJEXhQERERFIU\nDkRERCRF4UBERERSFA5EREQkReFAREREUhQOREREJEXhQERERFIUDkRERCRF4UBERERSFA5EREQk\nReFAREREUhQOREREJEXhQERERFIUDkRERCRF4UBERERSFA5EREQkReFAREREUhQOREREJEXhQERE\nRFIUDkRERCRF4UBERERSFA5EREQkReFAZAczs2vMbDlzfDt4vmBmN5rZsJlNmNltZnZG5j3OMbPP\nmNmUmR03s3ebmf5tEdnCWurdABGpu28BlwIW/7wYPHc98BLg5cA4cCPwceASgDgE3A48DlwEnAXc\nCswDb9+EtotIDVQ93a/2TUREGs6ic+6Uc+5kfIwAmFkPcBVw2Dn3JefcN4DXAM8zs+fEr70M+Ang\nlc65h5xzdwJ/CFxtZvryIbJF1ar09y1gP3AgPn62Rp8jIhv342b2QzP7dzP7sJmdEz8+QFRdvMuf\n6Jx7GHgUuDh+6CLgIefccPB+dwK9wNNr33QRqYVaJftF59ypGr23iFTP14BXAw8DZwLXAl82s58k\nCvbzzrnxzGtOxM8R357Ied4/92D1mywitVarcPDjZvZDYBa4F3ibc+6xGn2WiKxT3A3gfcvM7ge+\nD/w60f+/NXX48GF6e3tTjw0ODjI4OFjrjxbZcoaGhhgaGko9ViwWa/JZtQgHJb+JOOemavB5IlIl\nzrmimf0r8FTgC0CbmfVkqgf7gePx/ePAszNvsz94rqwjR45w6NChDbZaZGfIC85Hjx5lYGCg6p9V\n9XCwyjeRD5V6nb5BiFSmFt8izGwX8GPAXwMPEM1cuBT4ZPz8hcC5wFfjl9wL/IGZ7Q3GHbwIKAIa\niCyyRdV8NHHmm0hJ+gYhUplqfIsws/cAnyYK8E8C/pgoEPyNc27czD4IXGdmo8AEcANwj3Pu6/Fb\nfI4oBNxqZm8hqha+E3ifc25hI38+EamfmoeD4JvILbX+LBGp2NnAR4E9wCngbuAi59zp+PnDwBJw\nG1AA7gCu9i92zi2b2eXA+4mqCVPAzcA1m9R+EamBqoeDMt9Ehsq9TkQ2n3OubL+dc24OeGN8lDrn\nMeDyKjdNROqoFpWD1b6JiIiISAOrxYBEjSAUERHZwrQ5ioiIiKRo7fMKOOdK/uzvl7otx8xWPSc8\nL3u7nvda7/kiIrL9KRxUaHl5Gedc6vCPLS8vs7S0lLr1951zmFnJC3y5C72Z0dTUVPLIe4+1PiYi\nIpKlcFCBMAyEF3//8+LiIouLiywsLKy4v7y8nFzkfUgID8i/kAM0NTXR3NxMS0sLLS0tqfstLS25\n75O9b2ZJQMn7DBEREU/hoAJhMPDH4uJicn9+fp65uTnm5+eTw/+8tLSU+qafvS1XUWhqaqK1tZXW\n1lba2tpS95eXl2lubs4NHKVCSPj+IiIiWQoHFcpWCcIKwezsbHLMzMykfg7DQbZLoLm5Gcj/xg/Q\n3NxMoVBYcfjxDHlViXL3PQUEERHJo3BQgWy3wsLCQuqYnp4ueSwuLibdAz4Y+PvZb/6Q7g5obm6m\no6OD9vZ2Ojo6ki4NiLocfHdBGDjCx/z7+XP9zyIiInkUDioQBoOwYuC7D2ZmZpiammJycjJ1TExM\nsLi4SHNzcyoQhEe5roCWlhbm5ubo7OxMgoFzLnkffz88/GOefyycRZEdgyAiIgIKBxXxF1QfDsJg\nEIaDiYkJxsfHU8f8/HwymNAPKAxvSw1U9OFgYWEhmfUA0cW+paWF1tbWFbMZfGAIw0DId2OIiIjk\nUTiogHOOxcVF5ufnk3EF/pienmZ8fDw3GExMTDA/P58KA9mQkA0EYVhobm5OgogPI+HYhtbW1tzu\nirBCkVet8OdsR6UGX+b9jvPGZJR7vYjIdqdwUIHl5WUWFhaYm5tjeno6t/sgvPX3JyYmWFhYyL04\nr9atANDS0sL8/HwSQjo7O+no6KCzs5POzs5U9aFUOMirVrS0tGzrcFDq8FWXUr+TUmM/FAxEZKdQ\nOKiADwezs7NJ90GxWEyOqampFcfk5CRTU1PJgMTsxTsckAisuBD5ysHMzAzt7e25RzYcZD/Dr4fQ\n2tqaWh9hu4aDUpUBf9vS0pJMCW1ra0vd969frZogIrKdKRxUYHl5mcXFxaRyMD4+ztjYGCMjI4yO\njqZmJ/hv+dnZCuGFKjxg5VRGf9vU1EShUEguZP6+v812E2QDgg8Ffn0Ef/hQsd3k/X7Do7W1dUXA\nKhQKACsGdDY1NbG8vJyaFSIist0pHFQgrBz4bgUfDoaHh1PrG4S3MzMzSTgotwaBlw0Ia7nA51Uk\n/BF+M84upNTSsj3/E8j+TsIAVSgUki4Zv3qlDwO+muIHdQLbsroiIlLO9rwy1Eg45mBqaiqpHJw+\nfZpTp04lsxZmZ2dX3F9aWirZj50NA162ayE7diBbMSgXDrJVB39s18pBdnxH+Dtrb29nbm4uNQMk\n7G4Ifyf+72ctG2iJiGwXCgcVyFYOJiYmUuEgXDY5eywtLQHlN0QKZR8r1X9eqpvCj2Pwqyv6YOAP\n//N2rBz4P3c4tiL8OawYwBPTQtva2lhcXEwFgbDCo4AgIjvF9rsy1JBfAMlPZfRdC76CkF0x0R9+\n/4WsvFCw1gtQ9gKWtyyzv+8Dge9bDw8fDirtS9+MC+V62+SrAKUGYXZ1daUqBs3NzbS2tlIoFFhY\nWEj92cIxCCIiO4XCQQX8RaSjo4Ouri56e3uZmppKug1KhQNfvl6tOyG7FXR2NcNwe+hyixyF7+nv\nh4s3hZ8XTqMMX5ctp+e1p1bKjb8InwvbE7YrrBzk7WbpN6sKuxzCI5zBEAaO7dgFIyKSR+GgAuFI\n966uLnp6epLBhs65ZKGiMBT4n/2I91JdAuGFP7zN3i91lHp9eBH3sy2AJCyUWp0x3KOh0mCyXnlj\nLkodeUEqPEqNz2hubk6Fg7zqQnt7+4r9K8IBiiIi253CQQXCcLBr165kUJsf6R6GgeytvyCVWqjI\nd1mEF3z/c7hFtD/KbR2dPcLKATwRDMLplaWmWZYKJ/6xjSg31iIvqGRDS6kwFO47kXfrQ1FeVaG1\ntTX5M/q/c3+OwoGI7BQKBxXIVg78oDY/I8APPgyXOvb3w2+zeUd4sc+70Ge3iPZH2J3h93vwR7Zb\nwF88wy6OUmElDC3ZoBKGhI0qN0Oj1GDLMByUOsqtc7C8vLyiyyGcJpqtGPjHFA5EZKdQOKiADwEd\nHR1JV4KZJYEhO0MhDAnOudyR8/7ICwDZ3R/LHXNzc8lnhRfQsFrgL3rZwYzllnUOQ0u2WlGNcODb\nkL3vQ0GpxZ3yAksYXMqtJxFWDrLrRrS2tiZ/1/55/3ehcCAiO4XCQQXCyoG/APk+6q6urrJTGZ1z\nqYWMwm+qPhxkv/2H97NhIzzm5uZobW1ldnY2WbAn7DooN24hb/BeOHDPj1MIKxphZWMjVht4mBdW\nsuGgXFdKdqClP3zlIDvewP99+M/wgxN9t5DCgYjsFAoHFfDfJNvb21MVA/+tPfz2Hl64fTgIVybM\n3ve7PWbDQHZb6PB+uNCSX9kvOzMhHOyY120RhhYfUnwwKFXRCCsbG1VqNkIYCEp1w6w1tGS7Lvyf\nMbvipP87CYPB/Py8KgcisuMoHFQgnBMP6dLzwsIChUKhbLdCGAiyASGvSpANB9lg4H+emZlJLXKU\nXQ2x1MXdd41kKxrhfX/R9ZWM7P2N/C7L3Ybf3vNWOgzDlH9N2L3g5V3Qw99vGHTCbolazcgQEdkK\nFA4qFPaF55Waw+fDCy2wokshvM2Wz33gWFxcTC72ed0KfsXGUvs6zM7OpsJAeEH0F/dSwSBbOQi7\nOqpZOcgLCNnKQRgSWlpaklCUPaD0mgzhmgXZwZjZKkL4eWEbRUR2AoWDCmQvKuHqgtkLmr/YhN/Q\nVxuQ6L8R55Xz82YjZCsL4Z4OYZfDWisHeSEhHAuRbUe1xhzkBYS8ykF4f2ZmhomJCSYnJ5mcnEwW\nKPJty1tAyv/sPyf795UdBxIOhlRAEJGdpOJwYGaXAL8PDABnAi9zzn0qc847gNcCfcA9wG875/5t\n482tP9+Hn7c5T3ixyfbvA2X70H048MEgbypjqf7/UgMV/bGWysFmdyuEv7e8+9kLd7aK4HfELBQK\nyQJFS0tLSSjKW4ehVOXAv7/v6snb2ErBQER2kvVUDrqAbwIfBD6RfdLM3gL8DvAq4HvAfwPuNLOD\nzrn59Te1/sKLSviYv5D5Pms/oC/bB543Nc//nLf4UfhzuQWRSs1wyHYDbLRysBndCmHloNR4g+bm\nZorFYmoHRb/nxfT0dNLlA+n1HcJ1H9ZSOfCDPFU5EJGdpuJw4Jy7A7gDwPL/tXwT8E7n3N/H57wK\nOAG8DPjY+pvaGMJw4KfF+QtQOP0vO3UQyu+sWG7Fv9WWTi5VXShXaVhv5SCv8rCR32WllQN/v6ur\nK9WVMDc3x/T0dDIV0fPTNcNgEH5e3piDsPtHlQMR2YmqOubAzJ4CHADu8o8558bN7D7gYrZ4OMhe\nyPwyvbD6pkl5r8/2s5d7fbmjVNXB3y/VpbDRykG1wkHe78WvIVEqILS3t6e6EqanpxkfH0+mImYv\n5r5yEH5O3hiRvDEH2XaKiGx31R6QeABwRJWC0In4uS0ve0FvBKsFh41WDmo1IBFWBgL/2GpTGX1w\n8V0J4+PjdHR0pLoawoBVakZEdmaJn166UysHZvZW4F3A9c65340fKwDXAb8BFIA7gTc4504GrzsH\n+B/AC4AJ4Bbgrc656iyjKSKbqmFmKxw+fJje3t7UY4ODgwwODtapRSttxQtEuKNgtqzuuzOyMyfC\ncRF+8GW2AmLxMsQbUapLITtg0D/ng46/zVunwFdLfCDwa1P42+XlZQqFAu3t7cnR0dGROtrb25M1\nIrIVhEYyNDTE0NBQ6rFisbju9zOzZwOvAx7MPHU98BLg5cA4cCPwceCS+HVNwO3A48BFwFnArcA8\n8PZ1N0hE6qba4eA4YMB+0tWD/cA3yr3wyJEjHDp0qMrN2XnyLmDhN/HsYz4chN+S83ZoDF8bvr4a\nbS211oG/9RUQP8bDzFYsFJUNCJ5vY9jWMBjkhYQwHPgqQiOGg7zwfPToUQYGBip+LzPbBXyYaJbR\nHwaP9wBXAa9wzn0pfuw1wDEze45z7n7gMuAngJ93zg0DD5nZHwJ/ZmbXOuc21v8kIpuuquHAOfeI\nmR0HLgX+GZJ/XJ5L9G1DashfSLMXMR8CwvPCcJC3h0H2G3xe1SEbGDbS7rzbvC4Sf9+Hg7wlncNB\niNmjqakpWUkyrCBkKwfZ7oWNBqEt4Ebg0865f4gv7N6ziP6dCMcRPWxmjxKNI7qfqFrwUBwMvDuB\n9wNPZ2UlQkQa3HrWOegCnkpUIQA438yeAYw45x4jKkG+3cz+jWgq4zuBHwB/V5UWS64wGOT1sfv7\n/tu3nz7pB1XmTbMML6jh68Opl9Vod/Z+WC0oNbUzWzXILoGcV/nw98t1KXR0dFAoFFasedCIlYNq\nMbNXAD9DFASy9gPzzrnxzOPhOKID5I8z8s8pHIhsMeupHDwL+EeigYcO+Iv48b8GrnLOvdvMOoEP\nEC2C9BXgJVt9jYOtoFxAyLvA+2/hpaZYlgsGeYsMrae9pX52ziWzKYAkFPgQUG5/hOyujNndJvPG\nHPjbzs7OFQMzt3M4MLOziQL9C51zC5v9+VthrJFIo6j2OKNy1rPOwZeAsjVW59y1wLXra5JsRF7X\ngg8C/rlsN4F/Xd6R9/q8AY7VaHcoG0D8tMVSS0hnuxV82/LWMch2KWQrCNkZEts5HBCtdLoPOGpP\n/AGbgeeb2e8ALwYKZtaTqR7sJxpjRHz77Mz77g+eK0ljjUTWrprjjFbTMLMVpHryvpGHF/JSF/Vy\nJf6819YyHIRrNEC6clBqaeiwchDuexGGg2woyOtayHavbONgAPAF4Kcyj90MHAP+DPghsEA0juiT\nAGZ2IXAu8NX4/HuBPzCzvcG4gxcBReDbtWy8iNSGwsE2sJYL10YubrW4MK4WLMJBiH7viHD3yamp\nqWQnxrm5uaSCsLS0lKoahKHAjyfo6uqis7OTzs7O1OwEP0Mhu/DRdl4+2Tk3ReYCbmZTwGnn3LH4\n5w8C15nZKNEaBjcA9zjnvh6/5HPxe9xq0fLpZxKNNXpfPboqRGTjFA6kIWTDgh90ODs7y9TUVOqY\nnJzk9OnTjIyMUCwWmZycZGZmhoWFhaQbwi+U1N7enoSBrq4uurq66O/vp6+vj+7ubrq6upLZCXkr\nIm7HQLAG2eR2GFgCbiNaBOkO4OrkZOeWzexyotkJXwWmiKoP12xGY0Wk+hQOpO7ClQz9rR906KsE\n4+PjqWNkZISRkRHGx8eTcDA/P58MRmxubqatrY329nY6Ozvp7u6mp6eH7u5u+vv76e3tXREOWlpa\nSo672Emcc7+Q+XkOeGN8lHrNY8DlNW6aiGwShQOpq7w9KHx3gu9K8OFgdHQ0OcbGxhgbG6NYLDI1\nNcXs7GwSDiDqUvCVAx8Oent76evro6+vLwkHvmvBVw7yQsFODAgisrMpHEjd5W045bsVwsrB6Ogo\nw8PDDA8PMz4+zsTEBJOTkyW7FXzloKuri+7ubvr6+ti9e3cqHJSrHEBj7qUhIlJrCgdSN+U2jPLd\nCrOzs0xOTlIsFpNwcOLECaamppienk6OsFsB0mMOwsqBDwe7du1i165dK8JBuK6Dp2AgIjuNwoE0\njOxSyeGAxImJCcbGxjh9+jQnT55kenqaubk55ufnmZubS+77MQeluhX8YEQ/W6GzszM1IFGhQERE\n4UAawGqVg2y3wsmTJ5mdnV2xr4LfsdEvfOSnMOZ1K4TrHYQ7MJYLBAoLIrJTKBxI3fgQkD2Wl5dT\n3QZ+PYPZ2dkVVYLsiojhplB+jQN/29bWlgSBcN+E7AqICgEistMpHEjd+BUQ/ZLI4e3k5GQSEHwo\nCHdiDENBuOgRsGLpY79PQnhkt6hWIBAReYLCgdRNuMOiHzvgl0WenJxMVQ38c2EwyFYMgNQujOVC\nQvj4Tl7TQEQkj8KB1I3vVlhYWGBubi5ZHnlubq5s5cB3J/j38PzF3VcEsqEg3J1RlQMRkdIUDqRu\nfLdCGA58tcCHg3CsQbZbodRGUXmVg7yuhezGSgoIIiIRhQOpm2y3wszMDNPT08n+Cb5y4ANCtlsh\nb8Eiv3TyWrsVFAxERFZqqncDZOfK61bw4WBiYmLNAxLhiWCQHXOQVzEoNSBRAUFEJKLKgdRMqW2Z\ns0skh8FgcnIytTSyrxz4bZn9WgbhDIUwCDQ3N69Yv6CtrY3W1tZkWqOCgYhIeQoHUlPZjZX8z8vL\nyytCwcTEBMVikbGxMUZHRykWi0xMTCTVA7+2gXOO5ubm5OJfKBRS9zs7OznjjDPYs2dPsjVzZ2cn\nhUIhNxwoIIiIpCkcSE1ll0QOb8NxBr5iMDY2xsjICGNjY0kFwe+66GcqwBMbK4XLIPuju7ubffv2\nsXfvXvr7++np6aGrq4tCoUBra6uCgYjIKhQOpGbCUJB3ZCsHvmrgw0F2OmN2S2YfDrq7u+np6Ulu\n/R4Ke/bsob+/P7X7oq8chKFA6xyIiKQpHEhNZQNCuEyyrxz42Qm+cjA6Osro6GiyAFI45iDsVmhr\na6Ojo4Pu7u5kQ6Xdu3cn1YLe3l56e3vp6elJuhV85cAPXlQwEBFZSeFAaiovGPglk/MGIvrKwejo\n6IpVE7NbMvvxBT09PfT19SVdCXv27Em2ZM5uzewrB3lVA4UEEZGIwoHUTHa8QRgMFhcXk10Xp6en\nmZiYWBEO/JTF8DXZyoHvVujv72fv3r0cOHCAffv20dHRkRzt7e10dHSkKgeQXjgpbLMCgojsdAoH\nUlOlKgd+CmO48JGfreC7FfIGMS4vLwNPjDnw3Qp9fX3s2bOH/fv3s3///mQKo5/GmN2JUURESlM4\nkJrJVgwWFhaS1RB91SA8/HbMvish/Abvd1xsaYn+kw0rAx0dHXR1daWOcKtmf5vdmllERPIpHEjN\nhOEg3HnRH36gYbjAke82AFIrHmaPzs7OVLeBX+cgXOwo3D9B4wlERNau4uWTzewSM/uUmf3QzJbN\n7IrM8x+wRrdWAAAgAElEQVSKHw+P26vXZNkqfDjIbq7kZyiEeyaEqx+GXQfNzc1Jt4AfO+CrAz4g\nZFdD1M6LIiIbs57KQRfwTeCDwCdKnPNZ4NWA/9d4bh2fI9tAXuXAjzPICwfZyoEPB9nDL3hUqnIQ\nLqusyoGISGUqDgfOuTuAOwCs9L+2c865UxtpmGx92cqBDwfh1szZboW8fRNaWlqSqoBfKrmrqysJ\nBu3t7anBh9ntmLWegYhIZWq1K+MLzOyEmX3HzG4ys901+hxpYHljDny3gl/10FcOstsxQ1Q58IMJ\ns90K5SoHpXZeFBGRtanFgMTPAh8HHgF+DPhT4HYzu9iV2qZPtiW/JXO2chB2K+RtxZytHIThwIeC\nvDEHfh2D1tbWVJVAVQMRkcpUPRw45z4W/PgvZvYQ8O/AC4B/rPbnSf2slvWylYNwQGI45mC1boXW\n1lYKhUISDvyKh9lwEM5U8PIWOhIRkfJqPpXROfeImQ0DT6VMODh8+DC9vb2pxwYHBxkcHKxxC6VW\nfOUgXN/AjzfIbqjk900IZyr4sQbt7e10dXUlGyv55ZL9hkp5qx/C9g8EQ0NDDA0NpR4rFot1ao2I\nbCc1DwdmdjawB/hRufOOHDnCoUOHat0c2QT+m7+flpg3lTHbrZDXpdDS0kKhUEjGGXR3d9Pb20tf\nXx99fX3JVsxhOPBjC8JgsF1DQl54Pnr0KAMDA3VqkYhsFxWHAzPrIqoC+H9xzzezZwAj8XEN0ZiD\n4/F5fw78K3BnNRosjSvbzRCOOQhnKpRa56Bc5cDvodDb28vu3buT3RZ37dqVhAM/S2G7hgERkc2y\nnsrBs4i6B1x8/EX8+F8DbwB+GngV0Ac8ThQK/sg5t7Dh1krDCoNBWDnI7qUQdiuE4aBU5cDvn+Ar\nB319fcmWzH7sQV7lALZvxUBEpNbWs87Blyg/BfLF62+ObHX+4u53YwwrB+FURh8OwtkKaxlz4CsH\nu3btSk1n9CsjqnIgIrJxmvwtGxYGgvA2r3LgxxtkV0jMWx3Rz1LIjjno7+8vOeZAOy5Wxsxeb2YP\nmlkxPr5qZi8Oni+Y2Y1mNmxmE2Z2m5mdkXmPc8zsM2Y2ZWbHzezdZqZ/W0S2MG28JFWRFxBWG3Pg\npzGup3LgqwV++mJYOShHVYUVHgPeAnyXaBzRq4G/M7Ofcc4dA64HXgK8HBgHbiQaU3QJQBwCbifq\nQrwIOAu4FZgH3r6ZfxARqR6FA9kQv5aBX58gvPUX/+zWzDMzM8zMzKRCgXMutZeCX9TIL4/sV0f0\nXQnt7e3JSoh+bYPm5mYtdlQh59xnMg+93cx+G7jIzH4IXAW8Iu5OxMxeAxwzs+c45+4HLgN+Avh5\n59ww8JCZ/SHwZ2Z2rXNucfP+NCJSLSr9yYaE3QZhVWBycjJ1+HUNwu6EMBg0NTWluhHCLZlXWyJZ\n2zJXh5k1mdkrgE7gXmCA6AvEXf4c59zDwKPAxfFDFwEPxcHAuxPoBZ6+Ge0WkepT5UDWLbuxUvaY\nmJhIBYNwhsLs7GxqhoO/uLe0tOCcq3jvBAWD9TOznyQKA+3ABPArzrnvmNkzgXnn3HjmJSeAA/H9\nA/HP2ef9cw/WptUiUksKB7Ih2UWO/DE/P58KB3mVA39Rz9tBsdTeCWFACKsGCggb8h3gGUTf9n8N\nuMXMnl/fJolIPSkcyLqFeyf4aYrhuIKJiYkV1QM/3mB2djapAPiLezh+oFzloNy2zFK5eFzA/4p/\n/IaZPQd4E/AxoM3MejLVg/1Ei5wR3z4785b7g+fK0rLpImu3mUumKxzIhmQrB+FUxWzVIAwGs7Oz\nFAoFmpqaVow5aGtrS6Yo+sGI/nE/KyFc0yB7yIY1AQXgAWARuBT4JICZXQicC3w1Pvde4A/MbG8w\n7uBFQBH49mofpGXTRdZuM5dMVziQDfHhINyO2Q9IzHYrhCFhdnY2GWMA+XsphJWDvJ0Xs9syS+XM\n7F1E26w/CnQDrwR+DniRc27czD4IXGdmo0TjEW4A7nHOfT1+i88RhYBbzewtwJnAO4H3aVVUka1L\n4UDWLRyQGIYDXzXIm62Q7VZYXFwsOVshr1vBdy1osaOqOYNo6fMzib7t/zNRMPiH+PnDwBJwG1E1\n4Q7gav9i59yymV0OvJ+omjAF3Ey0x4qIbFEKB1KWX8zIH+Fji4uLSRiYmppifHycYrFIsVhkbGyM\nsbExisUik5OTyboGYRhobm5Obay0a9cuenp6kj0Ushsrldp1UdbPOffaVZ6fA94YH6XOeQy4vMpN\nE5E6UjiQsrILG4WLHvm1DXylwIeDkZERRkdHKRaLjI+Pp8LB0tISQKpSkA0HfolkHw46Ozu1PLKI\nyCZSOJCywmWQfSjw97PdCBMTE0nVYGRkhPHx8WT8gd9kKawc+NkJYTjwVQO/JXPe3gmqGoiI1JbC\ngawqDAV+RcRw+mJYORgbG2N0dJTTp08zMTGRTGv0GyyFKyKGAxB9OOjt7U22Ze7u7lblQESkDhQO\npCxfOfDhYGFhgcXFRRYXF3NnJ/huhdOnTzM1NZVs1bywsJCMOQBobm5ObawUdiv09fXR19e3YsaC\nH3OgyoGISG0pHEhZYTDwocAvj+w3VSpVOZienk6qDf7w4xayuy7mhYO8aYyqHIiI1J7CgawqGxDC\ncBCOOfADEn04mJmZKfmeq4WD/v7+ZNqipjCKiGwuhYMdLtz8KE+4AqIfY+D3T8iuZZA95ubmkqWN\nw30Q/IZJ4ZbMftxBV1cXu3btoqurS1syi4jUicKBrBAGBr/AUbgssj/Gx8c5ffo0Y2NjTExMMD09\nnZqRAE9UCLJHa2tr7uZK2Z0Xs3soKBiIiNSewoEkwkWOPD8rYWZmJhl06JdF9oMPS4UDM0sNPMx2\nE5QLB74LQdsyi4hsPoUDAVYGA38bVg78Koh+5cPR0dFksaMwHCwsLLC8vJxsx+wrBX7bZd+dsFrl\nINsdoXAgIrI5FA5kxbLI4f2lpaVk4KGvFoyOjjIyMpIsdORXQZyenmZ2dja3W6GtrS1Z08AfPhz4\ngJAXDtSlICKy+RQOBEh3JYR7KYSVAz8jYWRkhFOnTiVrGYQ7LvpuheXl5aRLIBsO/MDDtVQOwq2Y\nFRBERDaHwoEkspss+cpB2K0QTlUcHh5OVj/0uy1mxxxkuxXCaYs+HPhgkA0HYTAA1K0gIrJJFA4k\npVw48JWD0dFRhoeHOXnyZGr1Q39/YWGhbLdCOF3RVw6y3Qqtra11/k2IiOxcCgfb3GrrGPiuA3+E\nKyEuLi5y+vRpRkdHGRsbY3x8nImJCaamppKKQfi6MBD47Ziz1YLu7m56e3uTjZV8SGhvb6etrS3V\nnSAiIvWhcLDD+a2X/cJGc3NzzM/PJ/eHh4cZHh5OZiX4HRZnZ2eTWQnLy8sAydRFfz9c/bCrq4vu\n7u7Ulsy9vb3JxkphOFAwEBGpr6ZKTjazt5nZ/WY2bmYnzOyTZnZB5pyCmd1oZsNmNmFmt5nZGdVt\ntlSLDwezs7PJVEU/4PD48eOcPHkyqR6EsxL82AI/+DAcY9Dc3JysZ+BXP/RdCeHyyL29vXR3d6fC\ngZ+6KCIi9VPpv8KXAO8Fngu8EGgFPmdmHcE51wO/CLwceD5wFvDxjTdV1mO1b+G+W2Fubi5Z9XBs\nbIzh4WFOnDiRzErw3Qq+S8GPLwg3Uyo1ADHckjmsHPhuBVUOREQaS0XdCs65l4Y/m9mrgZPAAHC3\nmfUAVwGvcM59KT7nNcAxM3uOc+7+qrRaNsyPD8irHIyNjSVHsVhMbn23gl/PYGFhIRkf4L/thz+X\n6lbwlQMfHMItmf3+CSIiUj8bHXPQBzhgJP55IH7Pu/wJzrmHzexR4GJA4aDBhOEgnI3gpyr65ZLD\nZZP9lMWFhYVkLQMfCMKNlbLdCtkxB34ZZT9LIRyQKCIi9bPucGDR17vrgbudc9+OHz4AzDvnxjOn\nn4ifkwaQXfAoWzkYHR3l1KlTnDx5ksnJyWSBo/Dw4QBILVAUbrQUzlTIG3OQtyGTKgciIvW3kcrB\nTcDTgJ+tUlukxrKhAJ7YkjlvieTh4WGmpqaYnZ1NHT4YLC0tJbMTwvUM/OGXRvbBwB/d3d10d3fn\nbuWsaYwiIvW3rnBgZu8DXgpc4px7PHjqONBmZj2Z6sH++LmSDh8+TG9vb+qxwcFBBgcH19NEieVt\nqBTeD9c1CBczmpubS4KAH3zo1zMIByD6QBDumeCP/v7+3IGHYYUguwqirN3Q0BBDQ0Opx4rFYp1a\nIyLbScXhIA4Gvwz8nHPu0czTDwCLwKXAJ+PzLwTOBe4t975Hjhzh0KFDlTZH1iAbDLIrIPqA4MOB\nDwZ+bEGpcADQ3NxMoVDIrRD09fWxe/fuZD0Dvwpia2trajOl7K6LCgprkxeejx49ysDAQJ1aJCLb\nRUXhwMxuAgaBK4ApM9sfP1V0zs0658bN7IPAdWY2CkwANwD3aKZCffkw4C/s4c8+GIThwAcEPyth\nLZWDcMBhufUMsuFAoUBEpLFUWjl4PdHshC9mHn8NcEt8/zCwBNwGFIA7gKvX30Sphmwg8Ldht0K2\nS8Ef4TlhOAiXSe7o6GDXrl3JTARfMejr60t1K/jKQV63ggKCiEhjqHSdg1XnmDnn5oA3xoc0gLxu\nBb/scV63gg8IfrEjHwj8bdit4GclhOFg9+7d7Nu3L+lO8IMQw3AQDjxUMBARaSzaW2GHyIaCMBzk\ndSv4qsH8/PyKaoMPBn4vhbBy0NPTw+7du9m7dy+9vb3Jrot+5kLYrRCGA08BQUSk/hQOdojsQMRS\nASE75sCvZZA3DTI75iDsVti7dy89PT20t7dTKBSSNQ8KhUIyW0FERBqTwsE2kLctc/hYWBkI7y8s\nLCTLI4f7JvgZCn4b5ux6BP4oFAr09PQkRzhTwW/FHK570NraqoWORES2AIWDbSS7poG/71dADKcn\n+tuxsTFOnTrFyMgIxWKRqampZMdFHwxaW1tXHC0tLXR2drJnz55kRoIPCH7KYjYQaIEjEZGtQeFg\nmyi1yJFzjvn5eWZmZpiamkqWQ/bH2NgYJ0+eZGRkJKkezM7Osri4CJCMKfDdAr5roL29na6uLvbu\n3ZvMTOju7qarqysZeOj3SvDhQAFBRGRrUDjYRvIWOfIbK4VLI4+Pjye3Y2NjjIyMpCoHPhyElYNw\nUKEPAN3d3UnloK+vLwkHYeXAhwK/oZLCgYhI49P2d9tEqWCwvLzM/Px8sutisVhkZGSEU6dOcfz4\ncY4fP86pU6cYHR1NKge+WwGiykFrayuFQoGurq5kcaM9e/awb9++JBz09PSkwoGfleCPcPdGhYPG\nYWZvM7P7zWzczE6Y2SfN7ILMOQUzu9HMhs1swsxuM7MzMuecY2afMbMpMztuZu82M/37IrJFqXKw\nzeQtdJStHPhwcOrUKcbGxpicnGR6ejrpcihXOfDhIDz8Ykd5lYNwAGO4e6M0jEuA9wL/RPTvwZ8C\nnzOzg865mfic64GXAC8HxoEbgY/HryUOAbcDjwMXAWcBtwLzwNs37U8iIlWjcLANZMcYhMEgrBxM\nTU0l4eDkyZOcOHGC0dHRZIOlcNdFXzloamqira0tGWPQ09NDf3//iopBOGMh3ENBqyA2NufcS8Of\nzezVwElgALjbzHqAq4BXOOe+FJ/zGuCYmT0nXhb9MuAngJ93zg0DD5nZHwJ/ZmbXOucWN+9PJCLV\noHCwTZRaw8Avi+wrB+Pj48l2zD4c+OmN4a2fxujHC/huhe7u7mQVxD179iRTFv30Rb/okZ+pIFtO\nH9ES6SPxzwNE/07c5U9wzj1sZo8CFwP3E1ULHoqDgXcn8H7g6cCDm9BuEakihYNtILv1sr+4+4u9\nn5kwPT3NzMxMsvKhDwL+/HDfhHA6pF/noKWlJRl/EC5q5IOAxhVsbRb9pV0P3O2c+3b88AFgPrMF\nO8CJ+Dl/zomc5/1zCgciW4zCwTYQhgN/0fe3c3NzyZgCHwyy2zBnN1QKw4EfJxCGAz+1MbuWQTgj\nQbakm4CnAT9b74aISH0pHGwD4cDDcPljv9iRrxzkhYOFhYXUBky+O8IrFw5UOdg+zOx9wEuBS5xz\njwdPHQfazKwnUz3YHz/nz3l25i33B8+VdPjwYXp7e1OPDQ4OMjg4WOGfQGT7GxoaYmhoKPVYsVis\nyWcpHGwD2cqBXwnRH75yUKpbIbsZ01orB+3t7cnSyKocbF1xMPhl4Oecc49mnn4AWAQuBT4Zn38h\ncC7w1fice4E/MLO9wbiDFwFF4NuUceTIEQ4dOlSVP4fIdpcXnI8ePcrAwEDVP0vhYBvw4cBXDmZn\nZ5MwEK6KWKpbIQwE6wkHWstg6zKzm4BB4Apgysz8N/6ic27WOTduZh8ErjOzUWACuAG4xzn39fjc\nzxGFgFvN7C3AmcA7gfc55xY2888jItWhcLANhDsrhpWDqakpJiYmUpUDHw58QPDrGeQdsPYxB37c\ngSoHW87riWYnfDHz+GuAW+L7h4El4DagANwBXO1PdM4tm9nlRLMTvgpMATcD19Sw3SJSQwoH20BY\nOfDrFfhFjSYmJlJjDrLdCn5L5vC9QqXCgd9nIRyMGO64mK0cmFnu7pFSX865VZOcc24OeGN8lDrn\nMeDyKjZNROpI4WALyO6ymL2fFwx81aBYLCYBwVcOfMXAr2WwmnBlQx8Uwo2UwhUQw2CQFxBERKTx\nKRxsEaVK/37XxbArwS92VCwWGRsbSwJCNhzom7yIiORRONgiSi2N7MOBn7bouxP8joujo6OpcQdz\nc3MsLCysuWogIiI7j8LBFpKdcujXJcgbhOgrB6Ojo6kVElU5EBGR1SgcbBFh5cAvWOSPsHIQdiv4\nyoEfhBgORvTBQkREJEvhYIsIuxJ8KPCDCsPKQdit4Mcc+GmL2fUNVDkQEZE8CgdbQN6Oi+EmS6Uq\nB75bwZ+X3UtB4UBERPIoHGwRed0K/oIfrooYjjnw3QrZsQrhYEYREZEshYMtItw/Idx1MewuCLsM\nshsp5W3FHK6C6G+z9/0iR34RJL+2Qbj2QXZ9AxER2doUDraIsGrgA4JfBtkviexXPPRdB3nBIBsQ\ngNTFPXvhD1dAzC58lBcMFBJERLa+ihbBN7O3mdn9ZjZuZifM7JNmdkHmnC+a2XJwLMWbu8g65QUD\nXzHI7pXgA0JYOSi3dwKwYuVDHwb8nglh9aCSFRFFRGRrqnSHnEuA9wLPBV4ItAKfM7OO4BwH/E+i\n/dwPEO3Q9uaNN3VnWy0gZLsVfNdCdpxBVrZqkN1DoVTlIFs1UEAQEdk+KupWcM69NPzZzF4NnAQG\ngLuDp6adc6c23DpJ+HCwlspBNhj41/tqwVoqB2FIWC0g+PdQMBAR2R42urduH1GlYCTz+CvN7JSZ\nPWRm78pUFmQd8mYp+HDgA0K5AYmrjTnwXQXZUBB2Kaw23kBERLaHdQ9ItOiKcD1wt3Pu28FTHwG+\nDzwO/DTwbuAC4Nc20M4dLZzGGFYO/BTGvDEHfkBiXhgI5XUp5IWDtQQEhQURke1hI7MVbgKeBjwv\nfNA591fBj/9iZseBL5jZU5xzj5R6s8OHD9Pb25t6bHBwkMHBwQ00cfsotUJiuLhRqemLXnjR9veb\nm5uT8QVtbW0UCoXU/V27dtHV1UVHRwft7e20tbWtGJyYFwoUEGpvaGiIoaGh1GPFYrFOrRGR7WRd\n4cDM3ge8FLjEOfejVU6/DzDgqUDJcHDkyBEOHTq0nubIKkpNU/RTFTs6Okoeu3fvZt++fezevZve\n3l527dpFR0cHra2tJWcvyObIC89Hjx5lYGCgTi0Ske2i4nAQB4NfBn7OOffoGl7yTKJxCauFCKmR\nsNsgvG1qakpVB7q6upL7/ra/v5/du3fT399Pb28vXV1dSQVhtZkLIiKyNVUUDuL1CgaBK4ApM9sf\nP1V0zs2a2fnAbwK3A6eBZwDXAV9yzn2res2WSphZMl4gOxuhvb2drq4uenp6Sh69vb3J/bByEFYM\nVDkQEdk+Kq0cvJ6oCvDFzOOvAW4B5onWP3gT0AU8Bvwt8CcbaqVsSFg5CAcY+i4FHw76+vro7+9P\nbvv7+1NVBV9RaG9vT7oV8lZXVEAQEdnaKl3noOzUR+fcD4AXbKRBUn3lFjhqb29n165d9PT00N/f\nz549e1JHZ2cn7e3tK44wHPjPUDAQEdketLfCDpAXDlpbWykUCknloLu7m76+Pvbs2cO+ffs444wz\n2LdvXxIEskdLS0tSKfCfEX6eiIhsXQoHO0BeOCgUCqlw4LsVfDg4cOAABw4cyB1bEP4sIiLbj8LB\nFtHU1JTqEigUCsnaBn5BJL/wEUTrF7S1tdHR0ZGsXeADQfhzT08Pe/fuTWYjdHd3p2YktLS05I4p\nUBeCiMj2pXCwBYTf/Nva2mhvb08tcORXQWxqakrGEXR2diZdBX5RI3+Eix51dXWxZ8+eZB0DHwx8\nxUBBQERk51E42CLCykGhUMA5l0xR9GV+/1wYDCYnJ1PjBLLjBjo7O+nt7U0OvxpiXjhQQBAR2RkU\nDrYAXzloaWmhra0tCQb+MT+WwAeDXbt2MT09zfT0NDMzM6lzwn0S/DoHu3btSh2+cuA/w7chvBUR\nke1L4WCL8Bdz35Xgf/bdA74rIdzG2d+GCyCFqyT6dQ+ySyZnuxU8BQQRkZ1ho1s210R2M5lGUa92\nZSsH7e3tySyDz3/+8/T29tLf38/evXvZv38/Z511FmeffTZPfvKTOf/883nKU57Ceeedx7nnnss5\n55zDOeecw9lnn81ZZ53FmWeeyRlnnJHaO6HcmIO1BgP9HVamUdslIjuTwkEF6tmu7JgDHw4+/elP\n09vbm2yQ5MPBOeecw3nnncf555/Peeedx5Of/GSe/OQnc+6553L22WfzpCc9iSc96UkcOHAgtbFS\nOCBxI3sm6O+wMo3aLhHZmdStsAWEF+bm5ubUc83NzXR1ddWjWSIisk01ZOVARERE6kfhQERERFIa\noVuhHeDYsWPJA8VikaNHj9atQaU0YrsasU2gdlWqWu0K/j9q3/CbiciO1Qjh4DyAK6+8MvXgwMBA\nPdqyqkZsVyO2CdSuSlW5XecBX13tJDO7BPh9YAA4E3iZc+5TmXPeAbwW6APuAX7bOfdvwfP9wPuA\ny4Fl4OPAm5xzU1X5k4jIpmuEcHAn8Erge8BsfZsisuW1EwWDO9d4fhfwTeCDwCeyT5rZW4DfAV5F\n9P/ofwPuNLODzrn5+LSPAvuBS4E24GbgA8CV2fcTka2h7uHAOXea6B8XEamOVSsGnnPuDuAOAMuf\nq/om4J3Oub+Pz3kVcAJ4GfAxMzsIXAYMOOe+EZ/zRuAzZvZ7zrnjG/qTiEhdaECiiOQys6cAB4C7\n/GPOuXHgPuDi+KGLgFEfDGJfABzw3E1qqohUmcKBiJRygOgifyLz+In4OX/OyfBJ59wSMBKcIyJb\nTN27FURk5zp8+DC9vb2pxwYHBxkcHKxTi0Qa19DQ0IrVVIvFYk0+S+FAREo5DhjRYMOwerAf+EZw\nzhnhi8ysGdgdP1fWkSNHOHToUFUaK7Ld5QXno0eP1mQGVkN1K5jZ1Wb2iJnNmNnXzOzZdW7PNWa2\nnDm+XYd2XGJmnzKzH8ZtuCLnnHeY2eNmNm1mnzezp9a7XWb2oZzf3+01btPbzOx+Mxs3sxNm9kkz\nuyBzTsHMbjSzYTObMLPbzOyMUu+5ie36YuZ3tWRmN9WyXeU45x4husBfGrSxh2gsgR/0eC/QZ2bP\nDF56KVGouG+TmioiVdYw4cDMfgP4C+Aa4JnAg0RTpvbWtWHwLaJvSgfi42fr0AY/3ewNRH3AKcF0\ns9cBzwGmiH53bfVsV+yzpH9/ta4XXwK8l+gC9kKgFficmXUE51wP/CLwcuD5wFlEc/Pr3S4H/E+e\n+H2dCby5lo0ysy4ze4aZ/Uz80Pnxz+fEP18PvN3MfsnMfgq4BfgB8HcAzrnvEE2b/Esze7aZPS/+\ncw5ppoLI1tVI3QqHgQ84524BMLPXE/0DfhXw7jq2a9E5d6qOn7/h6WZ1bBfA3Gb+/pxzLw1/NrNX\nEw2YGwDujr/5XgW8wjn3pfic1wDHzOw5zrn769Gu4KnpTf7v7VnAPxIFE0cU0AH+GrjKOfduM+sk\nWregD/gK8JJgjQOA3yRaBOkLRIsg3Ub036SIbFENUTkws1aifyTDKVOO6B+bi0u9bpP8eFw2/3cz\n+3DwjaohrHG6WT29IC6jf8fMbjKz3Zv8+X1EF72R+OcBolAc/r4eBh5lc39f2XZ5rzSzU2b2kJm9\nK1NZqDrn3Jecc03OuebMcVVwzrXOubOcc53OucvC1RHj58ecc1c653qdc/3Oud9yzk3Xst0iUluN\nUjnYCzSTP2Xqws1vTuJrwKuBh4lKvNcCXzazn2ygpWHXMt2sXj5LVK5/BPgx4E+B283s4jj81VRc\nzbgeuNs558eKHADm4wAV2rTfV4l2AXwE+D7wOPDTRBWzC4Bf24x2iYh4jRIOGpJzLlyC9ltmdj/R\nP96/DnyoPq3aOpxzYZfGv5jZQ8C/Ay8gKmXX2k3A06jPOJFyfLueFz7onPur4Md/MbPjwBfM7Cnx\n4EARkU3REN0KwDCwRDQQK7SfNUyH2izOuSLwr0DNZwJUIJxuFmqo3x0ko9+H2YTfn5m9D3gp8ALn\n3OPBU8eBtnjsQWhTfl+Zdv1oldPvI/q7baT/3kRkB2iIcOCcWwAeID1lyuKf17xOfK2Z2S6i8vhq\n/6hvmjVON2sIZnY2sIca//7iC/AvAz/vnHs08/QDwCLp39eFwLlE0/Lq1a48zyTqMmqY/95EZGdo\npG6F64CbzewB4H6i2QudRDu81YWZvQf4NFFXwpOAPya6sAyVe10N2tFF9O3Rzwg438yeAYw45x7j\nielm/0a0c947Caab1aNd8XEN0ZiD4/F5f05UeVnrjoHradNNRNMlrwCmzMxXVIrOuVnn3LiZfRC4\nzhOny6gAAAocSURBVMxGgQngBuCeWs1UWEu7zOx8olH/twOngWcQ/T/xJefct2rVLhGRPA0TDpxz\nH4vXNHgHUYn3m8BldZ5GeDbRjpF7gFNEU84uineS3EzVmG622e16A9GgulfFbXqcKBT8UVwpqpXX\nx235Yubx1xDN0YcoeC4RTbkrEE3HvLqGbVpLu+aJ1j94E9H6EY8Bfwv8SY3bJSKyQsOEAwDn3E1E\ng7UagnOuIRZ4j+fjl+0Ccs5dSzSbYtOsoV0v3qy2eM65VbvKnHNzwBvjY1Os1i7n3A+IBmqKiNRd\nQ4w5EBERkcahcCAiIiIpCgciIiKSonAgIiIiKQoHIiIikqJwICIiIikKByIiIpKicCAiIiIpCgci\nIiKSonAgIiIiKQoHIiIikqJwICIiIikKByIiIpKicCAiIiIpCgciIiKSonAgIiIiKS31boCIiMh2\n9OijjzI8PFz2nL1793LuueduUovWTuFARESkyh599FEuvPAgs7PTZc9rb+/k4YePNVxAUDgQERGp\nsuHh4TgYfBg4WOKsY8zOXsnw8LDCgYiIyM5xEDhU70ZUTAMSRUREJEXhQERERFIUDkRERCRF4UBE\nRERSFA5EREQkReFARHa8oaGhejchobaU1kjtaaS21IKmMopIVZjZ1cDvAQeAB4E3Oue+Xt9Wrc3Q\n0BCDg4Mbfp/VVsRby2p41WpLNTRSW2Bt7anG30G12rKVKRyIyIaZ2W8AfwG8DrgfOAzcaWYXOOfK\nrx9bY8vLyxw9erTsOTMzMxv+nLWsiFcotPPxj9/GmWeeWdO27FRr+TtYy4qEa1n2eLv/PSkciEg1\nHAY+4Jy7BcDMXg/8InAV8O76NWuU6ekpBgYGyp7V1NTMo48+uqFvlKuviPcV5uZ+l8svv7zmbdmp\nVv87WH1FwrUue9zU1MRnPvOZkkHv2LFjlTW+wSgciMiGmFkrMAC8yz/mnHNm9gXg4ro1DIApYInV\nlrBdXr6Sr3zlKxw8WOqcSsrRpVbEOwYsb1pb1vLtd25ujkKhUPL50dHRVasum7lx0MzMTNn2PHFB\nLr8qYbkL97Fjx9aw7PFXWF7+f1YNeluZwoGIbNReoBk4kXn8BHBhide0w8a+XX33u9+N7w0Be0qc\n9VB8+0iZd/oGAFdeeWXZz2ttLfCe9/w5e/fuzX3+kUf8Z9xOFASy7tm0tgwPD/P7v/9WFhZmy75P\nNCZ9uewZq1VdVmsLRN+yl5fLf85q5wwPD3PXXf+wansipf4OvgHYqr/fSLm/p4fj2/8LKNVF9BDw\nd2Xa8sRnbOT/g+C17et+kxzmnKvm+4nIDmNmZwI/BC52zt0XPP7nwPOdcyuqB2b2m8BHNq+VItve\nK51zH63Wm6lyICIbNUxUu9+feXw/cLzEa+4EXgl8D1jt662IlNYOnEf0/1TVqHIgIhtmZl8D7nPO\nvSn+2YBHgRucc++pa+NEpGKqHIhINVwH3GxmD/DEVMZO4OZ6NkpE1kfhQEQ2zDn3MTPbC7yDqDvh\nm8BlzrlT9W2ZiKyHuhVEREQkRXsriIiISIrCgYiIiKQoHIhIzZlZv5l9xMyKZjZqZn9lZl1reN3F\nZnaXmU3Gr/2imZVe0q/G7Qle/1kzWzazKza7LfH5N5jZd8xs2sy+b2b/3cx61vHZV5vZI2Y2Y2Zf\nM7Nnr3L+fzSzY/H5D5rZSyr9zGq1x8xea2ZfNrOR+Pj8au2vVVsyr3tF/N/GJ+rVFjPrNbMbzexx\nM5uN/1t5cSWfqXAgIpvho0Rr0V5KtOfC84EPlHuBmV0MfBa4A3hWfLyP1Zb0q1F7gnYdJlrXoVoD\ntipty1lEy/L9LvB04D8BLwb+qpIPDTbLugZ4JtFOmnfGA0vzzv8/4rb+JfAzRMv//f9m9rRKPrda\n7QF+Lm7PC4CLgMeAz8WLcm12W/zrzgPeA3x5o21Yb1vi5cy/AJwL/CpwAfBbRAuVrZ1zTocOHTpq\ndgA/QXRBf2bw2GXAInCgzOvuBa5tlPbE5/0M0foNZ8TvcUW92pJ5n18DZoCmCl7zNeC/Bz8b8APg\nzSXO/xvgUzl/RzdV6e+lovbkvL4JKAJX1qMt8effDbwG+BDwiXr8XoDXA98FmjfyuaociEitXQyM\nOue+ETz2BaJv3s/Ne4GZ7YufGzaze8zseNyl8Lx6tCduUwfRks9vcM6drEI71t2WHH3AuHNuTVWV\nYLOsu/xjLrqylNss6+L4+dCdZc5fs3W2J6sLaAVG6tSWa4ATzrkPbeTzq9CWXyIObfH/Nw+Z2dvM\nrKLrvcKBiNTaASB1MXXOLRH9I36gxGvOj2+vISqxXwYcBe4ysx+rQ3sAjgB3O+f+foOfX422JOLy\n8ttZY7dIrNxmWaU+90CF51diPe3J+nOi0nk2wNS8LWb2s0QVg9du8LM33Bai/3f+I9H1/SVEa4/8\nF+C/VvLBCgcisi5m9qfxwKtSx5KZXbDOt/f/Nv0P59wtzrkHnXO/S7Qd3lWb3Z544OEvEK38uJbz\na/m7CT+nG/gM8C3gjzf6fluVmb0V+HXgZc65+U3+7F3ALcBvOedGN/OzS2giCg+vc859wzn3t8Cf\nEHU3rJlWSBSR9fp/ifpWy/lfRJsvnRE+aGbNwG5Kb8z0o/g2u5ftMaKBVpvdnp8n+kZWNLPw8U+Y\n2Zedc7+wiW3x5+0iKuuPAb8aVxzWaj2bZR2v8PxKrKc9AJjZ7wFvBi51zv1LHdryY8CTgU/bE/9x\nNMVtmwcudM6V2/+5mm2B6P+d+bj7wTsGHDCzFufc4lo+WOFARNbFOXcaOL3aeWZ2L9BnZs8M+tYv\nJRpYdV/ea5xz3zOzx4ELM09dANy+2e0B/pRolH7oW8CbgBXdDDVui68Y3Ek0CPGKSr8tO+cWLNoH\n41LgU/F7WvzzDSVedm/O8/8hfnxD1tkezOzNwNuAF2XGbWxmW44BP5V57E+AXcD/TTSLYrPaAnAP\nMJh57ELgR2sNBv7DdejQoaOmB9EF/Z+AZwPPI+oeuDV4/iyif2SfFTz2JmAUeDnRt7N3AlPAU+rR\nnpz32PBshfW0BegmGsH+TeApRN8i/VHJbIVfB6aBVxHNmvgAUaDZFz9/C/Cu4PyLgTmiKZQXAtcS\nbbf9tCr9N1Jpe94Sf/6vZH4HXZvdlpzXV3O2QqW/l7OJqkk3AD9OND32OPDWij63Go3XoUOHjnIH\n0Wj6DxNNNRsl+hbeGTz/ZKLy6fMzr3sz8H1ggmia2MX1bE/mPZaqFA4qagvR/P6lzLEc355b4We/\nAfgeUQXiXtLh7B+A/y9z/suB78Tn/zPR5lrV/O9kze0BHsn5PSwBf7TZbcl5bdXCwTr/np4LfDUO\nFd8lClJWyWdq4yURERFJ0WwFERERSVE4EBERkRSFAxEREUlROBAREZEUhQMRERFJUTgQERGRFIUD\nERERSVE4EBERkRSFAxEREUlROBAREZEUhQMRERFJ+d/lhG2hpVdtJAAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f2c02476c50>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Let's convert the uint8 image to 32 bit floats and rescale \n",
    "# the values to be centered around 0, between [-0.5, 0.5]. \n",
    "# \n",
    "# We again plot the image and histogram to check that we \n",
    "# haven't mangled the data.\n",
    "scaled = image.astype(numpy.float32)\n",
    "scaled = (scaled - (255 / 2.0)) / 255\n",
    "_, (ax1, ax2) = plt.subplots(1, 2)\n",
    "ax1.imshow(scaled.reshape(28, 28), cmap=plt.cm.Greys);\n",
    "ax2.hist(scaled, bins=20, range=[-0.5, 0.5]);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "PlqlwkX-O0Hd"
   },
   "source": [
    "Great -- we've retained the correct image data while properly rescaling to the range [-0.5, 0.5].\n",
    "\n",
    "## Reading the labels\n",
    "\n",
    "Let's next unpack the test label data. The format here is similar: a magic number followed by a count followed by the labels as `uint8` values. In more detail:\n",
    "\n",
    "    [offset] [type]          [value]          [description] \n",
    "    0000     32 bit integer  0x00000801(2049) magic number (MSB first) \n",
    "    0004     32 bit integer  10000            number of items \n",
    "    0008     unsigned byte   ??               label \n",
    "    0009     unsigned byte   ??               label \n",
    "    ........ \n",
    "    xxxx     unsigned byte   ??               label\n",
    "\n",
    "As with the image data, let's read  the first test set value to sanity check our input path. We'll expect a 7."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2016-09-16T14:49:22.925176",
     "start_time": "2016-09-16T14:49:22.897739"
    },
    "cellView": "both",
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0
     },
     "output_extras": [
      {}
     ]
    },
    "colab_type": "code",
    "collapsed": false,
    "executionInfo": {
     "elapsed": 90,
     "status": "ok",
     "timestamp": 1446749126903,
     "user": {
      "color": "#1FA15D",
      "displayName": "Michael Piatek",
      "isAnonymous": false,
      "isMe": true,
      "permissionId": "00327059602783983041",
      "photoUrl": "//lh6.googleusercontent.com/-wKJwK_OPl34/AAAAAAAAAAI/AAAAAAAAAlk/Rh3u6O2Z7ns/s50-c-k-no/photo.jpg",
      "sessionId": "716a6ad5e180d821",
      "userId": "106975671469698476657"
     },
     "user_tz": 480
    },
    "id": "d8zv9yZzQOnV",
    "outputId": "ad203b2c-f095-4035-e0cd-7869c078da3d"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "magic number 2049\n",
      "label count 10000\n",
      "First label: 7\n"
     ]
    }
   ],
   "source": [
    "with gzip.open(test_labels_filename) as f:\n",
    "    # Print the header fields.\n",
    "    for field in ['magic number', 'label count']:\n",
    "        print(field, struct.unpack('>i', f.read(4))[0])\n",
    "\n",
    "    print('First label:', struct.unpack('B', f.read(1))[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "zAGrQSXCQtIm"
   },
   "source": [
    "Indeed, the first label of the test set is 7.\n",
    "\n",
    "## Forming the training, testing, and validation data sets\n",
    "\n",
    "Now that we understand how to read a single element, we can read a much larger set that we'll use for training, testing, and validation.\n",
    "\n",
    "### Image data\n",
    "\n",
    "The code below is a generalization of our prototyping above that reads the entire test and training data set."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2016-09-16T14:49:23.525119",
     "start_time": "2016-09-16T14:49:22.928289"
    },
    "cellView": "both",
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0
     },
     "output_extras": [
      {}
     ]
    },
    "colab_type": "code",
    "collapsed": false,
    "executionInfo": {
     "elapsed": 734,
     "status": "ok",
     "timestamp": 1446749128718,
     "user": {
      "color": "#1FA15D",
      "displayName": "Michael Piatek",
      "isAnonymous": false,
      "isMe": true,
      "permissionId": "00327059602783983041",
      "photoUrl": "//lh6.googleusercontent.com/-wKJwK_OPl34/AAAAAAAAAAI/AAAAAAAAAlk/Rh3u6O2Z7ns/s50-c-k-no/photo.jpg",
      "sessionId": "716a6ad5e180d821",
      "userId": "106975671469698476657"
     },
     "user_tz": 480
    },
    "id": "ofFZ5oJeRMDA",
    "outputId": "ff2de90b-aed9-4ce5-db8c-9123496186b1"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extracting /tmp/mnist-data/train-images-idx3-ubyte.gz\n",
      "Extracting /tmp/mnist-data/t10k-images-idx3-ubyte.gz\n"
     ]
    }
   ],
   "source": [
    "IMAGE_SIZE = 28\n",
    "PIXEL_DEPTH = 255\n",
    "\n",
    "def extract_data(filename, num_images):\n",
    "    \"\"\"Extract the images into a 4D tensor [image index, y, x, channels].\n",
    "  \n",
    "    For MNIST data, the number of channels is always 1.\n",
    "\n",
    "    Values are rescaled from [0, 255] down to [-0.5, 0.5].\n",
    "    \"\"\"\n",
    "    print('Extracting', filename)\n",
    "    with gzip.open(filename) as bytestream:\n",
    "        # Skip the magic number and dimensions; we know these values.\n",
    "        bytestream.read(16)\n",
    "\n",
    "        buf = bytestream.read(IMAGE_SIZE * IMAGE_SIZE * num_images)\n",
    "        data = numpy.frombuffer(buf, dtype=numpy.uint8).astype(numpy.float32)\n",
    "        data = (data - (PIXEL_DEPTH / 2.0)) / PIXEL_DEPTH\n",
    "        data = data.reshape(num_images, IMAGE_SIZE, IMAGE_SIZE, 1)\n",
    "        return data\n",
    "\n",
    "train_data = extract_data(train_data_filename, 60000)\n",
    "test_data = extract_data(test_data_filename, 10000)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "0x4rwXxUR96O"
   },
   "source": [
    "A crucial difference here is how we `reshape` the array of pixel values. Instead of one image that's 28x28, we now have a set of 60,000 images, each one being 28x28. We also include a number of channels, which for grayscale images as we have here is 1.\n",
    "\n",
    "Let's make sure we've got the reshaping parameters right by inspecting the dimensions and the first two images. (Again, mangled input is a very common source of errors.)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2016-09-16T14:49:23.829853",
     "start_time": "2016-09-16T14:49:23.527283"
    },
    "cellView": "both",
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0
     },
     "output_extras": [
      {},
      {}
     ]
    },
    "colab_type": "code",
    "collapsed": false,
    "executionInfo": {
     "elapsed": 400,
     "status": "ok",
     "timestamp": 1446749129657,
     "user": {
      "color": "#1FA15D",
      "displayName": "Michael Piatek",
      "isAnonymous": false,
      "isMe": true,
      "permissionId": "00327059602783983041",
      "photoUrl": "//lh6.googleusercontent.com/-wKJwK_OPl34/AAAAAAAAAAI/AAAAAAAAAlk/Rh3u6O2Z7ns/s50-c-k-no/photo.jpg",
      "sessionId": "716a6ad5e180d821",
      "userId": "106975671469698476657"
     },
     "user_tz": 480
    },
    "id": "0AwSo8mlSja_",
    "outputId": "11490c39-7c67-4fe5-982c-ca8278294d96"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training data shape (60000, 28, 28, 1)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nOBxzgP8fyQ4wgPwddckAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f2c0217a650>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "print('Training data shape', train_data.shape)\n",
    "_, (ax1, ax2) = plt.subplots(1, 2)\n",
    "ax1.imshow(train_data[0].reshape(28, 28), cmap=plt.cm.Greys);\n",
    "ax2.imshow(train_data[1].reshape(28, 28), cmap=plt.cm.Greys);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "cwBhQ3ouTQcW"
   },
   "source": [
    "Looks good. Now we know how to index our full set of training and test images."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "PBCB9aYxRvBi"
   },
   "source": [
    "### Label data\n",
    "\n",
    "Let's move on to loading the full set of labels. As is typical in classification problems, we'll convert our input labels into a [1-hot](https://en.wikipedia.org/wiki/One-hot) encoding over a length 10 vector corresponding to 10 digits. The vector [0, 1, 0, 0, 0, 0, 0, 0, 0, 0], for example, would correspond to the digit 1."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2016-09-16T14:49:23.854577",
     "start_time": "2016-09-16T14:49:23.831545"
    },
    "cellView": "both",
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0
     },
     "output_extras": [
      {
       "item_id": 1
      }
     ]
    },
    "colab_type": "code",
    "collapsed": false,
    "executionInfo": {
     "elapsed": 191,
     "status": "ok",
     "timestamp": 1446749131421,
     "user": {
      "color": "#1FA15D",
      "displayName": "Michael Piatek",
      "isAnonymous": false,
      "isMe": true,
      "permissionId": "00327059602783983041",
      "photoUrl": "//lh6.googleusercontent.com/-wKJwK_OPl34/AAAAAAAAAAI/AAAAAAAAAlk/Rh3u6O2Z7ns/s50-c-k-no/photo.jpg",
      "sessionId": "716a6ad5e180d821",
      "userId": "106975671469698476657"
     },
     "user_tz": 480
    },
    "id": "9pK1j2WlRwY9",
    "outputId": "1ca31655-e14f-405a-b266-6a6c78827af5"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extracting /tmp/mnist-data/train-labels-idx1-ubyte.gz\n",
      "Extracting /tmp/mnist-data/t10k-labels-idx1-ubyte.gz\n"
     ]
    }
   ],
   "source": [
    "NUM_LABELS = 10\n",
    "\n",
    "def extract_labels(filename, num_images):\n",
    "    \"\"\"Extract the labels into a 1-hot matrix [image index, label index].\"\"\"\n",
    "    print('Extracting', filename)\n",
    "    with gzip.open(filename) as bytestream:\n",
    "        # Skip the magic number and count; we know these values.\n",
    "        bytestream.read(8)\n",
    "        buf = bytestream.read(1 * num_images)\n",
    "        labels = numpy.frombuffer(buf, dtype=numpy.uint8)\n",
    "    # Convert to dense 1-hot representation.\n",
    "    return (numpy.arange(NUM_LABELS) == labels[:, None]).astype(numpy.float32)\n",
    "\n",
    "train_labels = extract_labels(train_labels_filename, 60000)\n",
    "test_labels = extract_labels(test_labels_filename, 10000)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "hb3Vaq72UUxW"
   },
   "source": [
    "As with our image data, we'll double-check that our 1-hot encoding of the first few values matches our expectations."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2016-09-16T14:49:23.864350",
     "start_time": "2016-09-16T14:49:23.857177"
    },
    "cellView": "both",
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0
     },
     "output_extras": [
      {
       "item_id": 1
      }
     ]
    },
    "colab_type": "code",
    "collapsed": false,
    "executionInfo": {
     "elapsed": 127,
     "status": "ok",
     "timestamp": 1446749132853,
     "user": {
      "color": "#1FA15D",
      "displayName": "Michael Piatek",
      "isAnonymous": false,
      "isMe": true,
      "permissionId": "00327059602783983041",
      "photoUrl": "//lh6.googleusercontent.com/-wKJwK_OPl34/AAAAAAAAAAI/AAAAAAAAAlk/Rh3u6O2Z7ns/s50-c-k-no/photo.jpg",
      "sessionId": "716a6ad5e180d821",
      "userId": "106975671469698476657"
     },
     "user_tz": 480
    },
    "id": "uEBID71nUVj1",
    "outputId": "3f318310-18dd-49ed-9943-47b4aae7ee69"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training labels shape (60000, 10)\n",
      "First label vector [ 0.  0.  0.  0.  0.  1.  0.  0.  0.  0.]\n",
      "Second label vector [ 1.  0.  0.  0.  0.  0.  0.  0.  0.  0.]\n"
     ]
    }
   ],
   "source": [
    "print('Training labels shape', train_labels.shape)\n",
    "print('First label vector', train_labels[0])\n",
    "print('Second label vector', train_labels[1])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "5EwtEhxRUneF"
   },
   "source": [
    "The 1-hot encoding looks reasonable.\n",
    "\n",
    "### Segmenting data into training, test, and validation\n",
    "\n",
    "The final step in preparing our data is to split it into three sets: training, test, and validation. This isn't the format of the original data set, so we'll take a small slice of the training data and treat that as our validation set."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2016-09-16T14:49:23.874014",
     "start_time": "2016-09-16T14:49:23.866161"
    },
    "cellView": "both",
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0
     },
     "output_extras": [
      {
       "item_id": 1
      }
     ]
    },
    "colab_type": "code",
    "collapsed": false,
    "executionInfo": {
     "elapsed": 176,
     "status": "ok",
     "timestamp": 1446749134110,
     "user": {
      "color": "#1FA15D",
      "displayName": "Michael Piatek",
      "isAnonymous": false,
      "isMe": true,
      "permissionId": "00327059602783983041",
      "photoUrl": "//lh6.googleusercontent.com/-wKJwK_OPl34/AAAAAAAAAAI/AAAAAAAAAlk/Rh3u6O2Z7ns/s50-c-k-no/photo.jpg",
      "sessionId": "716a6ad5e180d821",
      "userId": "106975671469698476657"
     },
     "user_tz": 480
    },
    "id": "e7aBYBtIVxHE",
    "outputId": "bdeae1a8-daff-4743-e594-f1d2229c0f4e"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Validation shape (5000, 28, 28, 1)\n",
      "Train size 55000\n"
     ]
    }
   ],
   "source": [
    "VALIDATION_SIZE = 5000\n",
    "\n",
    "validation_data = train_data[:VALIDATION_SIZE, :, :, :]\n",
    "validation_labels = train_labels[:VALIDATION_SIZE]\n",
    "train_data = train_data[VALIDATION_SIZE:, :, :, :]\n",
    "train_labels = train_labels[VALIDATION_SIZE:]\n",
    "\n",
    "train_size = train_labels.shape[0]\n",
    "\n",
    "print('Validation shape', validation_data.shape)\n",
    "print('Train size', train_size)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "1JFhEH8EVj4O"
   },
   "source": [
    "# Defining the model\n",
    "\n",
    "Now that we've prepared our data, we're ready to define our model.\n",
    "\n",
    "The comments describe the architecture, which fairly typical of models that process image data. The raw input passes through several [convolution](https://en.wikipedia.org/wiki/Convolutional_neural_network#Convolutional_layer) and [max pooling](https://en.wikipedia.org/wiki/Convolutional_neural_network#Pooling_layer) layers with [rectified linear](https://en.wikipedia.org/wiki/Convolutional_neural_network#ReLU_layer) activations before several fully connected layers and a [softmax](https://en.wikipedia.org/wiki/Convolutional_neural_network#Loss_layer) loss for predicting the output class. During training, we use [dropout](https://en.wikipedia.org/wiki/Convolutional_neural_network#Dropout_method).\n",
    "\n",
    "We'll separate our model definition into three steps:\n",
    "\n",
    "1. Defining the variables that will hold the trainable weights.\n",
    "1. Defining the basic model graph structure described above. And,\n",
    "1. Stamping out several copies of the model graph for training, testing, and validation.\n",
    "\n",
    "We'll start with the variables."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2016-09-16T14:49:28.803525",
     "start_time": "2016-09-16T14:49:23.875999"
    },
    "cellView": "both",
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0
     },
     "output_extras": [
      {
       "item_id": 1
      }
     ]
    },
    "colab_type": "code",
    "collapsed": false,
    "executionInfo": {
     "elapsed": 2081,
     "status": "ok",
     "timestamp": 1446749138298,
     "user": {
      "color": "#1FA15D",
      "displayName": "Michael Piatek",
      "isAnonymous": false,
      "isMe": true,
      "permissionId": "00327059602783983041",
      "photoUrl": "//lh6.googleusercontent.com/-wKJwK_OPl34/AAAAAAAAAAI/AAAAAAAAAlk/Rh3u6O2Z7ns/s50-c-k-no/photo.jpg",
      "sessionId": "716a6ad5e180d821",
      "userId": "106975671469698476657"
     },
     "user_tz": 480
    },
    "id": "Q1VfiAzjzuK8",
    "outputId": "f53a39c9-3a52-47ca-d7a3-9f9d84eccf63"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Done\n"
     ]
    }
   ],
   "source": [
    "import tensorflow as tf\n",
    "\n",
    "# We'll bundle groups of examples during training for efficiency.\n",
    "# This defines the size of the batch.\n",
    "BATCH_SIZE = 60\n",
    "# We have only one channel in our grayscale images.\n",
    "NUM_CHANNELS = 1\n",
    "# The random seed that defines initialization.\n",
    "SEED = 42\n",
    "\n",
    "# This is where training samples and labels are fed to the graph.\n",
    "# These placeholder nodes will be fed a batch of training data at each\n",
    "# training step, which we'll write once we define the graph structure.\n",
    "train_data_node = tf.placeholder(\n",
    "  tf.float32,\n",
    "  shape=(BATCH_SIZE, IMAGE_SIZE, IMAGE_SIZE, NUM_CHANNELS))\n",
    "train_labels_node = tf.placeholder(tf.float32,\n",
    "                                   shape=(BATCH_SIZE, NUM_LABELS))\n",
    "\n",
    "# For the validation and test data, we'll just hold the entire dataset in\n",
    "# one constant node.\n",
    "validation_data_node = tf.constant(validation_data)\n",
    "test_data_node = tf.constant(test_data)\n",
    "\n",
    "# The variables below hold all the trainable weights. For each, the\n",
    "# parameter defines how the variables will be initialized.\n",
    "conv1_weights = tf.Variable(\n",
    "  tf.truncated_normal([5, 5, NUM_CHANNELS, 32],  # 5x5 filter, depth 32.\n",
    "                      stddev=0.1,\n",
    "                      seed=SEED))\n",
    "conv1_biases = tf.Variable(tf.zeros([32]))\n",
    "conv2_weights = tf.Variable(\n",
    "  tf.truncated_normal([5, 5, 32, 64],\n",
    "                      stddev=0.1,\n",
    "                      seed=SEED))\n",
    "conv2_biases = tf.Variable(tf.constant(0.1, shape=[64]))\n",
    "fc1_weights = tf.Variable(  # fully connected, depth 512.\n",
    "  tf.truncated_normal([IMAGE_SIZE // 4 * IMAGE_SIZE // 4 * 64, 512],\n",
    "                      stddev=0.1,\n",
    "                      seed=SEED))\n",
    "fc1_biases = tf.Variable(tf.constant(0.1, shape=[512]))\n",
    "fc2_weights = tf.Variable(\n",
    "  tf.truncated_normal([512, NUM_LABELS],\n",
    "                      stddev=0.1,\n",
    "                      seed=SEED))\n",
    "fc2_biases = tf.Variable(tf.constant(0.1, shape=[NUM_LABELS]))\n",
    "\n",
    "print('Done')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "QHB_u04Z4HO6"
   },
   "source": [
    "Now that we've defined the variables to be trained, we're ready to wire them together into a TensorFlow graph.\n",
    "\n",
    "We'll define a helper to do this, `model`, which will return copies of the graph suitable for training and testing. Note the `train` argument, which controls whether or not dropout is used in the hidden layer. (We want to use dropout only during training.)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2016-09-16T14:49:28.834326",
     "start_time": "2016-09-16T14:49:28.805723"
    },
    "cellView": "both",
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0
     },
     "output_extras": [
      {
       "item_id": 1
      }
     ]
    },
    "colab_type": "code",
    "collapsed": false,
    "executionInfo": {
     "elapsed": 772,
     "status": "ok",
     "timestamp": 1446749138306,
     "user": {
      "color": "#1FA15D",
      "displayName": "Michael Piatek",
      "isAnonymous": false,
      "isMe": true,
      "permissionId": "00327059602783983041",
      "photoUrl": "//lh6.googleusercontent.com/-wKJwK_OPl34/AAAAAAAAAAI/AAAAAAAAAlk/Rh3u6O2Z7ns/s50-c-k-no/photo.jpg",
      "sessionId": "716a6ad5e180d821",
      "userId": "106975671469698476657"
     },
     "user_tz": 480
    },
    "id": "V85_B9QF3uBp",
    "outputId": "457d3e49-73ad-4451-c196-421dd4681efc"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Done\n"
     ]
    }
   ],
   "source": [
    "def model(data, train=False):\n",
    "    \"\"\"The Model definition.\"\"\"\n",
    "    # 2D convolution, with 'SAME' padding (i.e. the output feature map has\n",
    "    # the same size as the input). Note that {strides} is a 4D array whose\n",
    "    # shape matches the data layout: [image index, y, x, depth].\n",
    "    conv = tf.nn.conv2d(data,\n",
    "                        conv1_weights,\n",
    "                        strides=[1, 1, 1, 1],\n",
    "                        padding='SAME')\n",
    "\n",
    "    # Bias and rectified linear non-linearity.\n",
    "    relu = tf.nn.relu(tf.nn.bias_add(conv, conv1_biases))\n",
    "\n",
    "    # Max pooling. The kernel size spec ksize also follows the layout of\n",
    "    # the data. Here we have a pooling window of 2, and a stride of 2.\n",
    "    pool = tf.nn.max_pool(relu,\n",
    "                          ksize=[1, 2, 2, 1],\n",
    "                          strides=[1, 2, 2, 1],\n",
    "                          padding='SAME')\n",
    "    conv = tf.nn.conv2d(pool,\n",
    "                        conv2_weights,\n",
    "                        strides=[1, 1, 1, 1],\n",
    "                        padding='SAME')\n",
    "    relu = tf.nn.relu(tf.nn.bias_add(conv, conv2_biases))\n",
    "    pool = tf.nn.max_pool(relu,\n",
    "                          ksize=[1, 2, 2, 1],\n",
    "                          strides=[1, 2, 2, 1],\n",
    "                          padding='SAME')\n",
    "\n",
    "    # Reshape the feature map cuboid into a 2D matrix to feed it to the\n",
    "    # fully connected layers.\n",
    "    pool_shape = pool.get_shape().as_list()\n",
    "    reshape = tf.reshape(\n",
    "        pool,\n",
    "        [pool_shape[0], pool_shape[1] * pool_shape[2] * pool_shape[3]])\n",
    "  \n",
    "    # Fully connected layer. Note that the '+' operation automatically\n",
    "    # broadcasts the biases.\n",
    "    hidden = tf.nn.relu(tf.matmul(reshape, fc1_weights) + fc1_biases)\n",
    "\n",
    "    # Add a 50% dropout during training only. Dropout also scales\n",
    "    # activations such that no rescaling is needed at evaluation time.\n",
    "    if train:\n",
    "        hidden = tf.nn.dropout(hidden, 0.5, seed=SEED)\n",
    "    return tf.matmul(hidden, fc2_weights) + fc2_biases\n",
    "\n",
    "print('Done')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "7bvEtt8C4fLC"
   },
   "source": [
    "Having defined the basic structure of the graph, we're ready to stamp out multiple copies for training, testing, and validation.\n",
    "\n",
    "Here, we'll do some customizations depending on which graph we're constructing. `train_prediction` holds the training graph, for which we use cross-entropy loss and weight regularization. We'll adjust the learning rate during training -- that's handled by the `exponential_decay` operation, which is itself an argument to the `MomentumOptimizer` that performs the actual training.\n",
    "\n",
    "The vaildation and prediction graphs are much simpler the generate -- we need only create copies of the model with the validation and test inputs and a softmax classifier as the output."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2016-09-16T14:49:29.058141",
     "start_time": "2016-09-16T14:49:28.836169"
    },
    "cellView": "both",
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0
     },
     "output_extras": [
      {
       "item_id": 1
      }
     ]
    },
    "colab_type": "code",
    "collapsed": false,
    "executionInfo": {
     "elapsed": 269,
     "status": "ok",
     "timestamp": 1446749139596,
     "user": {
      "color": "#1FA15D",
      "displayName": "Michael Piatek",
      "isAnonymous": false,
      "isMe": true,
      "permissionId": "00327059602783983041",
      "photoUrl": "//lh6.googleusercontent.com/-wKJwK_OPl34/AAAAAAAAAAI/AAAAAAAAAlk/Rh3u6O2Z7ns/s50-c-k-no/photo.jpg",
      "sessionId": "716a6ad5e180d821",
      "userId": "106975671469698476657"
     },
     "user_tz": 480
    },
    "id": "9pR1EBNT3sCv",
    "outputId": "570681b1-f33e-4618-b742-48e12aa58132"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Done\n"
     ]
    }
   ],
   "source": [
    "# Training computation: logits + cross-entropy loss.\n",
    "logits = model(train_data_node, True)\n",
    "loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(\n",
    "  labels=train_labels_node, logits=logits))\n",
    "\n",
    "# L2 regularization for the fully connected parameters.\n",
    "regularizers = (tf.nn.l2_loss(fc1_weights) + tf.nn.l2_loss(fc1_biases) +\n",
    "                tf.nn.l2_loss(fc2_weights) + tf.nn.l2_loss(fc2_biases))\n",
    "# Add the regularization term to the loss.\n",
    "loss += 5e-4 * regularizers\n",
    "\n",
    "# Optimizer: set up a variable that's incremented once per batch and\n",
    "# controls the learning rate decay.\n",
    "batch = tf.Variable(0)\n",
    "# Decay once per epoch, using an exponential schedule starting at 0.01.\n",
    "learning_rate = tf.train.exponential_decay(\n",
    "  0.01,                # Base learning rate.\n",
    "  batch * BATCH_SIZE,  # Current index into the dataset.\n",
    "  train_size,          # Decay step.\n",
    "  0.95,                # Decay rate.\n",
    "  staircase=True)\n",
    "# Use simple momentum for the optimization.\n",
    "optimizer = tf.train.MomentumOptimizer(learning_rate,\n",
    "                                       0.9).minimize(loss,\n",
    "                                                     global_step=batch)\n",
    "\n",
    "# Predictions for the minibatch, validation set and test set.\n",
    "train_prediction = tf.nn.softmax(logits)\n",
    "# We'll compute them only once in a while by calling their {eval()} method.\n",
    "validation_prediction = tf.nn.softmax(model(validation_data_node))\n",
    "test_prediction = tf.nn.softmax(model(test_data_node))\n",
    "\n",
    "print('Done')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "4T21uZJq5UfH"
   },
   "source": [
    "# Training and visualizing results\n",
    "\n",
    "Now that we have the training, test, and validation graphs, we're ready to actually go through the training loop and periodically evaluate loss and error.\n",
    "\n",
    "All of these operations take place in the context of a session. In Python, we'd write something like:\n",
    "\n",
    "    with tf.Session() as s:\n",
    "      ...training / test / evaluation loop...\n",
    "  \n",
    "But, here, we'll want to keep the session open so we can poke at values as we work out the details of training. The TensorFlow API includes a function for this, `InteractiveSession`.\n",
    "\n",
    "We'll start by creating a session and initializing the varibles we defined above."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2016-09-16T14:49:29.357483",
     "start_time": "2016-09-16T14:49:29.059952"
    },
    "cellView": "both",
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0
     }
    },
    "colab_type": "code",
    "collapsed": false,
    "id": "z6Kc5iql6qxV"
   },
   "outputs": [
    {
     "ename": "AttributeError",
     "evalue": "'module' object has no attribute 'global_variables_initializer'",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mAttributeError\u001b[0m                            Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-34-6eee600c01fb>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m     11\u001b[0m \u001b[0;31m# Initialize all the variables we defined above.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     12\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mparse_version\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__version__\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0mparse_version\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'0.12'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 13\u001b[0;31m     \u001b[0mtf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mglobal_variables_initializer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrun\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# for tf version >=0.12\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     14\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     15\u001b[0m     \u001b[0mtf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minitialize_all_variables\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrun\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# for tf version < 0.12\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mAttributeError\u001b[0m: 'module' object has no attribute 'global_variables_initializer'"
     ]
    }
   ],
   "source": [
    "from pkg_resources import parse_version\n",
    "\n",
    "# Create a new interactive session that we'll use in\n",
    "# subsequent code cells.\n",
    "s = tf.InteractiveSession()\n",
    "\n",
    "# Use our newly created session as the default for \n",
    "# subsequent operations.\n",
    "s.as_default()\n",
    "\n",
    "# Initialize all the variables we defined above. \n",
    "if parse_version(tf.__version__) >= parse_version('0.12'):\n",
    "    tf.global_variables_initializer().run() # for tf version >=0.12\n",
    "else:\n",
    "    tf.initialize_all_variables().run() # for tf version < 0.12"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "hcG8H-Ka6_mw"
   },
   "source": [
    "Now we're ready to perform operations on the graph. Let's start with one round of training. We're going to organize our training steps into batches for efficiency; i.e., training using a small set of examples at each step rather than a single example."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2016-09-16T14:49:29.584699",
     "start_time": "2016-09-16T14:49:29.359107"
    },
    "cellView": "both",
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0
     },
     "output_extras": [
      {
       "item_id": 1
      }
     ]
    },
    "colab_type": "code",
    "collapsed": false,
    "executionInfo": {
     "elapsed": 386,
     "status": "ok",
     "timestamp": 1446749389138,
     "user": {
      "color": "#1FA15D",
      "displayName": "Michael Piatek",
      "isAnonymous": false,
      "isMe": true,
      "permissionId": "00327059602783983041",
      "photoUrl": "//lh6.googleusercontent.com/-wKJwK_OPl34/AAAAAAAAAAI/AAAAAAAAAlk/Rh3u6O2Z7ns/s50-c-k-no/photo.jpg",
      "sessionId": "716a6ad5e180d821",
      "userId": "106975671469698476657"
     },
     "user_tz": 480
    },
    "id": "LYVxeEox71Pg",
    "outputId": "9184b5df-009a-4b1b-e312-5be94351351f"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Done\n"
     ]
    }
   ],
   "source": [
    "BATCH_SIZE = 60\n",
    "\n",
    "# Grab the first BATCH_SIZE examples and labels.\n",
    "batch_data = train_data[:BATCH_SIZE, :, :, :]\n",
    "batch_labels = train_labels[:BATCH_SIZE]\n",
    "\n",
    "# This dictionary maps the batch data (as a numpy array) to the\n",
    "# node in the graph it should be fed to.\n",
    "feed_dict = {train_data_node: batch_data,\n",
    "             train_labels_node: batch_labels}\n",
    "\n",
    "# Run the graph and fetch some of the nodes.\n",
    "_, l, lr, predictions = s.run(\n",
    "  [optimizer, loss, learning_rate, train_prediction],\n",
    "  feed_dict=feed_dict)\n",
    "\n",
    "print('Done')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "7bL4-RNm_K-B"
   },
   "source": [
    "Let's take a look at the predictions. How did we do? Recall that the output will be probabilities over the possible classes, so let's look at those probabilities."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2016-09-16T14:49:29.593985",
     "start_time": "2016-09-16T14:49:29.586233"
    },
    "cellView": "both",
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0
     },
     "output_extras": [
      {
       "item_id": 1
      }
     ]
    },
    "colab_type": "code",
    "collapsed": false,
    "executionInfo": {
     "elapsed": 160,
     "status": "ok",
     "timestamp": 1446749519023,
     "user": {
      "color": "#1FA15D",
      "displayName": "Michael Piatek",
      "isAnonymous": false,
      "isMe": true,
      "permissionId": "00327059602783983041",
      "photoUrl": "//lh6.googleusercontent.com/-wKJwK_OPl34/AAAAAAAAAAI/AAAAAAAAAlk/Rh3u6O2Z7ns/s50-c-k-no/photo.jpg",
      "sessionId": "716a6ad5e180d821",
      "userId": "106975671469698476657"
     },
     "user_tz": 480
    },
    "id": "2eNitV_4_ZUL",
    "outputId": "f1340dd1-255b-4523-bf62-7e3ebb361333"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[  2.25392316e-04   4.76219466e-05   1.66868209e-03   5.67827410e-05\n",
      "   6.03432059e-01   4.34970036e-02   2.19317553e-05   1.41285273e-04\n",
      "   1.54903228e-05   3.50893855e-01]\n"
     ]
    }
   ],
   "source": [
    "print(predictions[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "X5MgraJb_eQZ"
   },
   "source": [
    "As expected without training, the predictions are all noise. Let's write a scoring function that picks the class with the maximum probability and compares with the example's label. We'll start by converting the probability vectors returned by the softmax into predictions we can match against the labels."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2016-09-16T14:49:29.606284",
     "start_time": "2016-09-16T14:49:29.597095"
    },
    "cellView": "both",
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0
     },
     "output_extras": [
      {
       "item_id": 1
      }
     ]
    },
    "colab_type": "code",
    "collapsed": false,
    "executionInfo": {
     "elapsed": 220,
     "status": "ok",
     "timestamp": 1446750411574,
     "user": {
      "color": "#1FA15D",
      "displayName": "Michael Piatek",
      "isAnonymous": false,
      "isMe": true,
      "permissionId": "00327059602783983041",
      "photoUrl": "//lh6.googleusercontent.com/-wKJwK_OPl34/AAAAAAAAAAI/AAAAAAAAAlk/Rh3u6O2Z7ns/s50-c-k-no/photo.jpg",
      "sessionId": "716a6ad5e180d821",
      "userId": "106975671469698476657"
     },
     "user_tz": 480
    },
    "id": "wMMlUf5rCKgT",
    "outputId": "2c10e96d-52b6-47b0-b6eb-969ad462d46b"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "First prediction 4\n",
      "(60, 10)\n",
      "All predictions [4 4 2 7 7 7 7 7 7 7 7 7 0 8 9 0 7 7 0 7 4 0 5 0 9 9 7 0 7 4 7 7 7 0 7 7 9\n",
      " 7 9 9 0 7 7 7 2 7 0 7 2 9 9 9 9 9 0 7 9 4 8 7]\n"
     ]
    }
   ],
   "source": [
    "# The highest probability in the first entry.\n",
    "print('First prediction', numpy.argmax(predictions[0]))\n",
    "\n",
    "# But, predictions is actually a list of BATCH_SIZE probability vectors.\n",
    "print(predictions.shape)\n",
    "\n",
    "# So, we'll take the highest probability for each vector.\n",
    "print('All predictions', numpy.argmax(predictions, 1))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "8pMCIZ3_C2ni"
   },
   "source": [
    "Next, we can do the same thing for our labels -- using `argmax` to convert our 1-hot encoding into a digit class."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2016-09-16T14:49:29.615484",
     "start_time": "2016-09-16T14:49:29.609168"
    },
    "cellView": "both",
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0
     },
     "output_extras": [
      {
       "item_id": 1
      }
     ]
    },
    "colab_type": "code",
    "collapsed": false,
    "executionInfo": {
     "elapsed": 232,
     "status": "ok",
     "timestamp": 1446750498351,
     "user": {
      "color": "#1FA15D",
      "displayName": "Michael Piatek",
      "isAnonymous": false,
      "isMe": true,
      "permissionId": "00327059602783983041",
      "photoUrl": "//lh6.googleusercontent.com/-wKJwK_OPl34/AAAAAAAAAAI/AAAAAAAAAlk/Rh3u6O2Z7ns/s50-c-k-no/photo.jpg",
      "sessionId": "716a6ad5e180d821",
      "userId": "106975671469698476657"
     },
     "user_tz": 480
    },
    "id": "kZWp4T0JDDUe",
    "outputId": "47b588cd-bc82-45c3-a5d0-8d84dc27a3be"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Batch labels [7 3 4 6 1 8 1 0 9 8 0 3 1 2 7 0 2 9 6 0 1 6 7 1 9 7 6 5 5 8 8 3 4 4 8 7 3\n",
      " 6 4 6 6 3 8 8 9 9 4 4 0 7 8 1 0 0 1 8 5 7 1 7]\n"
     ]
    }
   ],
   "source": [
    "print('Batch labels', numpy.argmax(batch_labels, 1))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "bi5Z6whtDiht"
   },
   "source": [
    "Now we can compare the predicted and label classes to compute the error rate and confusion matrix for this batch."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2016-09-16T14:49:29.841313",
     "start_time": "2016-09-16T14:49:29.618274"
    },
    "cellView": "both",
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0
     },
     "output_extras": [
      {
       "item_id": 1
      },
      {
       "item_id": 2
      }
     ]
    },
    "colab_type": "code",
    "collapsed": false,
    "executionInfo": {
     "elapsed": 330,
     "status": "ok",
     "timestamp": 1446751307304,
     "user": {
      "color": "#1FA15D",
      "displayName": "Michael Piatek",
      "isAnonymous": false,
      "isMe": true,
      "permissionId": "00327059602783983041",
      "photoUrl": "//lh6.googleusercontent.com/-wKJwK_OPl34/AAAAAAAAAAI/AAAAAAAAAlk/Rh3u6O2Z7ns/s50-c-k-no/photo.jpg",
      "sessionId": "716a6ad5e180d821",
      "userId": "106975671469698476657"
     },
     "user_tz": 480
    },
    "id": "U4hrLW4CDtQB",
    "outputId": "720494a3-cbf9-4687-9d94-e64a33fdd78f"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.0666666666667\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAVgAAAFdCAYAAABGoXXzAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAFe9JREFUeJzt3XvQZHV95/H3h4sO18GSgJNoVgXikpopzAxeUAEVAlNW\nSYKVKANsiqVYAcOWNbu1BgotxlDruqYEjEpK1gsKAoWpNYYKDIoEstyKgkkII6DLTVgYBwGZyDAY\nh/ntH6dn8swzt+d09+/00z3vV1X/0Wf69Pf7dJ/59K9/ffrXKaUgSRq+XUbdgCRNKgNWkioxYCWp\nEgNWkioxYCWpEgNWkioxYCWpkt1q3nmS1wLHA48DL9esJUkdmQO8EbixlPLc9m5YNWBpwvXblWtI\n0iicAly1vRvUDtjHAdjjStj10P7uYd1S2OPivnZdeOsd/dXseWTpVzjo4jP72nfFovsHqg3LgcUD\n3scIal/Y3+O1yZVL4dT+nm/+52ClBznWYLDjbZBjDQY93sb0WBtZ7WeB/w0b8207agdsMy2w66Gw\n28L+7iFz+953n4XP9FezZ7e5e7HPwoP73PvZgWo370LmDXgfI6j9pj6f5432nNv/fQx6NA9wrMFg\nx9tgxxoMdryN6bE2+to7nPb0Qy5JqsSAlaRKDFhJqmT2B+yrloys9AFL3juy2jB/56x9xOieb481\naw+bAbsdoz3oF+yctd9lwHZvJz3WOqg9+wNWksaUAStJlRiwklRJXwGb5E+TPJZkXZK7krxt2I1J\n0rhrHbBJPgJ8HrgA+D3gPuDGJPsPuTdJGmv9jGCXAl8ppXyrlPIQcBbwEnD6UDuTpDHXKmCT7A4s\nAn64cVtpfvf7JuCI4bYmSeOt7Qh2f2BXYPW07auB1w2lI0maELVX02qsW9qsVDTVq5aM9MRuSdqx\n+4GV07bN/LcD2gbss8ArwIHTth8I/Gybe+1x8UDLwEnSaCxgy298rQIum9HeraYISim/Bu4Fjtm4\nLUl61wdb3VqSJkw/UwQXAZcnuRe4m+asgj2By4fYlySNvdYBW0q5tnfO65/TTA38E3B8KeXnw25O\nksZZXx9ylVIuBS4dci+SNFFci0CSKjFgJakSA1aSKjFgJakSA1aSKjFgJakSA1aSKjFgJamSNMu5\nVrrzZCFwL3wUmFetjiR1Z9NiL4tKKSu2d0tHsJJUiQErSZUYsJJUiQErSZUYsJJUiQErSZUYsJJU\niQErSZUYsJJUiQErSZUYsJJUSeuATXJkkr9N8lSSDUlOqNGYJI27fkawe9H8VPfHgHorxUjSmGv9\ns92llOXAcoAkGXpHkjQhnIOVpEoMWEmqpPUUQX+WA3OmbZsPLOimvCT15X5g5bRtL894744CdjH+\nooGk8bOALQeCm37RYIecIpCkSlqPYJPsBRwMbDyD4M1JDgOeL6U8OczmJGmc9TNFcDjw9zTnwBbg\n873t3wROH1JfkjT2+jkP9lacWpCkHTIoJakSA1aSKjFgJakSA1aSKjFgJakSA1aSKjFgJakSA1aS\nKulmsZe9z4TdFnZSajMvLOu+5s5uv2Wjq+3zvfMZxfG2fgW86GIvkjRSBqwkVWLASlIlBqwkVWLA\nSlIlBqwkVWLASlIlBqwkVWLASlIlBqwkVWLASlIlrQI2yXlJ7k7yL0lWJ/lukt+p1ZwkjbO2I9gj\ngS8C7wCOBXYHvp9kj2E3JknjrtVqWqWUD0y9nuQ04BlgEXDb8NqSpPE36BzsfkABnh9CL5I0UfoO\n2CQBLgFuK6U8MLyWJGkyDLLg9qXA7wLv3uEt1y2FzN1826uWNBdJmq3+9ermMlVZM+Pd+wrYJF8C\nPgAcWUpZtcMd9rh4NL9oIEmD2NpAcP0KeHHRjHZvHbC9cP0D4OhSyhNt95eknUWrgE1yKbAEOAFY\nm+TA3j+tKaW8POzmJGmctf2Q6yxgX+AW4Okplw8Pty1JGn9tz4P1q7WSNEMGpiRVYsBKUiUGrCRV\nYsBKUiUGrCRVYsBKUiUGrCRVYsBKUiWDrKY1cy9+BZjXSSmN2AvLRt2BdiYjOd52vL7VRo5gJakS\nA1aSKjFgJakSA1aSKjFgJakSA1aSKjFgJakSA1aSKjFgJakSA1aSKjFgJamSVgGb5Kwk9yVZ07vc\nkWRxreYkaZy1HcE+CfwZsBBYBNwMfC/JocNuTJLGXduf7f67aZs+meRs4J3Ag0PrSpImQN/LFSbZ\nBfgwsCdw59A6kqQJ0Tpgk8ynCdQ5wC+BE0spDw27MUkad/2MYB8CDgPmAn8EfCvJUdsP2eU0eTzV\nfGBBH+UlqSv3AyunbXt5xnu3DthSynrg0d7Vf0zyduDjwNnb3msx/qKBpPGzgC0HgquAy2a09zDO\ng90FePUQ7keSJkqrEWySzwA3AE8A+wCnAEcDxw2/NUkab22nCA4Avknzfn8N8M/AcaWUm4fdmCSN\nu7bnwZ5RqxFJmjSuRSBJlRiwklSJAStJlRiwklSJAStJlRiwklSJAStJlRiwklRJ3+vBjoX9lo2u\n9gsjrL2z/t07syuXja72OaMrPduPN0ewklSJAStJlRiwklSJAStJlRiwklSJAStJlRiwklSJAStJ\nlRiwklSJAStJlRiwklTJQAGb5NwkG5JcNKyGJGlS9B2wSd4GfBS4b3jtSNLk6Ctgk+wNXAmcAbww\n1I4kaUL0O4L9MnBdKeXmYTYjSZOk9XqwSU4C3gocPvx2JGlytArYJK8HLgGOLaX8euZ7LgfmTNs2\nH1jQprwkdex+YOW0bS/PeO+2I9hFwG8AK5Kkt21X4Kgk5wCvLqWULXdbDMxrWUqSRm0BWw4EVwGX\nzWjvtgF701aqXQ48CHx26+EqSTunVgFbSlkLPDB1W5K1wHOllAeH2ZgkjbthfJPLUaskbcXAvypb\nSnn/MBqRpEnjWgSSVIkBK0mVGLCSVIkBK0mVGLCSVIkBK0mVGLCSVIkBK0mVGLCSVMnA3+Sa1V5Y\nNuoORmNn/bt3ZueMsLbH2zY5gpWkSgxYSarEgJWkSgxYSarEgJWkSgxYSarEgJWkSgxYSarEgJWk\nSgxYSaqkVcAmuSDJhmmXB3a8pyTtfPpZi2AlcAyQ3vX1w2tHkiZHPwG7vpTy86F3IkkTpp852EOS\nPJXkkSRXJnnD0LuSpAnQNmDvAk4DjgfOAt4E/EOSvYbclySNvVZTBKWUG6dcXZnkbuCnwIeBb2x7\nz+XAnGnb5gML2pSXpI7dT/Ox01Qvz3jvgRbcLqWsSfIT4ODt33IxMG+QUpI0AgvYciC4CrhsRnsP\ndB5skr2Bg3oVJUlTtD0P9i+SHJXk3yV5F/BdmtO0rq7SnSSNsbZTBK8HrgJeC/wcuA14ZynluWE3\nJknjru2HXEtqNSJJk8a1CCSpEgNWkioxYCWpEgNWkioxYCWpEgNWkioxYCWpEgNWkioxYCWpkoFW\n05I0S7ywbNQdaCscwUpSJQasJFViwEpSJQasJFViwEpSJQasJFViwEpSJQasJFViwEpSJQasJFXS\nOmCT/GaSK5I8m+SlJPclWVijOUkaZ63WIkiyH3A78EPgeOBZ4BDgF8NvTZLGW9vFXs4FniilnDFl\n20+H2I8kTYy2UwQfBO5Jcm2S1UlWJDljh3tJ0k6obcC+GTgb+DFwHPBXwF8m+Q/DbkySxl3bKYJd\ngLtLKZ/qXb8vyXzgLOCKbe+2HJgzbdt8YEHL8pLUpfuBldO2vTzjvdsG7CrgwWnbHgQ+tP3dFgPz\nWpaSpFFbwJYDwVXAZTPau+0Uwe3AW6Ztewt+0CVJW2gbsBcD70xyXpKDkpwMnAF8afitSdJ4axWw\npZR7gBOBJTSTE+cDHy+lXFOhN0kaa61/9LCUcj1wfYVeJGmiuBaBJFViwEpSJQasJFViwEpSJQas\nJFViwEpSJQasJFViwEpSJQasJFXS+ptc/Vh47wL2WXhwF6U2c+u3F3dec5NzRlf66F8sH1ntnfUx\nh533cb/g1Iys9i3lhs5r/nLFw6xYNLPbOoKVpEoMWEmqxICVpEoMWEmqxICVpEoMWEmqxICVpEoM\nWEmqxICVpEoMWEmqpFXAJnksyYatXL5Yq0FJGldt1yI4HNh1yvUFwPeBa4fWkSRNiFYBW0p5bur1\nJB8EHiml/J+hdiVJE6DvOdgkuwOnAF8bXjuSNDkG+ZDrRGAu8M0h9SJJE2WQ9WBPB24opfxsRzd8\nZOlX2G3uXpttO2DJezlgyXsHKC9JdT1z9S08c/Utm21bv2btjPfvK2CT/DZwLPCHM7n9QRefOZIF\ntyVpEFsbCDYLbv/nGe3f7xTB6cBq4Po+95ekidc6YJMEOA24vJSyYegdSdKE6GcEeyzwBuAbQ+5F\nkiZK6znYUsoP2PzLBpKkrXAtAkmqxICVpEoMWEmqxICVpEoMWEmqxICVpEoMWEmqxICVpEoMWEmq\nJKWUeneeLATuhY8C86rV2ab9lnVfczZ4YdmoO5Am2CrgMoBFpZQV27ulI1hJqsSAlaRKDFhJqsSA\nlaRKDFhJqsSAlaRKDFhJqsSAlaRKDFhJqsSAlaRKWgVskl2SXJjk0SQvJXk4ySdrNSdJ46ztr8qe\nC5wJ/AnwAHA4cHmSF0opXxp2c5I0ztoG7BHA90opy3vXn0hyMvD24bYlSeOv7RzsHcAxSQ4BSHIY\n8G7g+mE3Jknjru0I9rPAvsBDSV6hCejzSynXDL0zSRpzbQP2I8DJwEk0c7BvBb6Q5OlSyhXb3m05\nMGfatvnAgpblJalL9wMrp217ecZ7tw3YzwGfKaV8p3f9R0neCJwHbCdgFzOSBbclaSAL2HIguGnB\n7R1qOwe7JzD9JxA29HE/kjTx2o5grwPOT/Ik8CNgIbAU+OqwG5Okcdc2YM8BLgS+DBwAPA38VW+b\nJGmKVgFbSlkL/JfeRZK0Hc6dSlIlBqwkVWLASlIlBqwkVWLASlIlBqwkVWLASlIlBqwkVWLASlIl\nbb8q258Lz4Q3Leyk1GbO6b7kJi8sG13t/UZYWyNx9C+W7/hGldz6msUjqz0S61fAi3VW05IkzZAB\nK0mVGLCSVIkBK0mVGLCSVIkBK0mVGLCSVIkBK0mVGLCSVIkBK0mVtA7YJHsnuSTJ40leSnJbksNr\nNCdJ46yfEezXgGOAU4D5wA+Am5LMG2ZjkjTuWgVskjnAh4D/Vkq5vZTyaCnl08DDwNk1GpSkcdV2\nBLsbsCvwq2nb1wHvGUpHkjQhWgVsKeVF4E7gU0nmJdklyanAEYBTBJI0RT/rwZ4KfB14ClgPrACu\nAhZtc48rl8KeczffdsQSeNeSPspLUkf+9ermMlVZM+PdWwdsKeUx4H1J9gD2LaWsTnIN8Og2dzr1\n4tEsuC1Jg3jVkuYy1foV8OK2x5NT9X0ebCllXS9cXwMcD/xNv/clSZOo9Qg2yXFAgB8DhwCfAx4A\nLh9qZ5I05vqZg50L/A/gt4Dngb8GPllKeWWYjUnSuOtnDvY7wHcq9CJJE8W1CCSpEgNWkioxYCWp\nktkfsHdcvePb1DL9BONO3T+60qP8u63duWeuvmVktSf9MZ/9AXvnZD8B27ZydKUn/KC39uYM2Hpm\nf8BK0pgyYCWpEgNWkirp55tcbcwB4OkH+7+Hl9bAYyv623d9/2WBZtWc9X3WZtWAxV/u/z767rln\noL97QNbuyy9XPNz3vuvXrB1o/4Ees3F8zF/ZlGdzdnTTlFLaF5ihJCcD365WQJJG55RSylXbu0Ht\ngH0tzUpbj9MMySRp3M0B3gjcWEp5bns3rBqwkrQz80MuSarEgJWkSgxYSarEgJWkSgxYSapk1gZs\nkj9N8liSdUnuSvK2juoemeRvkzyVZEOSE7qo26t9XpK7k/xLktVJvpvkdzqqfVaS+5Ks6V3uSLK4\ni9rT+ji397hf1FG9C3r1pl4e6Kj2bya5IsmzSV7qPf6d/Pxy7//W9L97Q5IvVq67S5ILkzza+5sf\nTvLJmjWn1d87ySVJHu/Vvy3J4bXqzcqATfIR4PPABcDvAfcBNybZv4PyewH/BHwM6PoctiOBLwLv\nAI4Fdge+3/uJ9NqeBP4MWAgsAm4Gvpfk0A5qA9B7Ef0ozfPdpZXAgcDrepf31C6YZD/gduBXNOeK\nHwr8V+AXtWv3HM6//b2vA36f5ni/tnLdc4Ezaf5//XvgE8AnkpxTue5GXwOOAU4B5gM/AG5KMq9K\ntVLKrLsAdwFfmHI9wP8DPtFxHxuAE0b4OOzf6+E9I6r/HPAfO6q1N80vFb8f+Hvgoo7qXgCsGMFj\n+1ng1lE8r9vo5xLgJx3UuQ74X9O2/TXwrQ5qzwF+DSyetv0e4M9r1Jx1I9gku9OMoH64cVtpHoWb\ngCNG1deI7Eczqni+y6K9t3EnAXsCd3ZU9svAdaWUmzuqN9UhvSmhR5JcmeQNHdT8IHBPkmt700Er\nkpzRQd0t9P7PnUIzuqvtDuCYJIf0ah8GvBu4voPauwG70rxrmGodld611F7spR/70zwIq6dtXw28\npft2RiNJaEYVt5VSupoTnE8TqHOAXwInllIe6qDuScBbad62du0u4DSa0fM8YBnwD0nml1LWVqz7\nZuBsmqmw/w68HfjLJL8qpVxRse7WnAjMBb7ZQa3PAvsCDyV5hWaa8vxSyjW1C5dSXkxyJ/CpJA/R\nZMrJNAO3/1uj5mwMWDUuBX6X5tW9Kw8Bh9H8Z/sj4FtJjqoZskleT/NCcmwp5de16mxLKeXGKVdX\nJrkb+CnwYeAbFUvvAtxdSvlU7/p9vRe4s4CuA/Z04IZSys86qPURmlA7CXiA5oX1C0me7uiF5VTg\n68BTNOvtrQCuonnXPHSzMWCfBV6h+dBhqgOBLg6AkUvyJeADwJGllEHXPZyxUsp64NHe1X9M8nbg\n4zQjrVoWAb8BrOiN2qF5B3NU74OPV/emiDpRSlmT5CfAwZVLrQKmr+P5IPChynU3k+S3aT5Q/cOO\nSn4O+Ewp5Tu96z9K8kbgPDp4YSmlPAa8r/fB8b6llNVJruHfjvuhmnVzsL1RzL00n/QBm94uH0Mz\nfzPReuH6B8D7SilPjLidXYBXV65xE7CAZiRzWO9yD3AlcFiX4QrNaTzAQQy+oO+O3M6WU15voRk9\nd+l0mrfKXcyBQjOvP/053UDHWVRKWdcL19fQnMXxNzXqzMYRLMBFwOVJ7gXuBpbSPDGX1y6cZC+a\n0cvG0dSbexPxz5dSnqxc+1JgCXACsDbJxlH8mlJK1eUek3wGuAF4AtiH5kOPo4HjatbtzXNuNsec\nZC3wXCllgJXaZybJX9B8sv1T4LeAT9O8daz9i3gXA7cnOY/m1Kh3AGcA/6ly3U16A5fTgMtLKRs6\nKnsdcH6SJ4Ef0ZwWuBT4ahfFkxxH83/7x8AhNCPqB6iVLbVPjRjglIqP0awju47mg5fDO6p7NM0r\n6ivTLl/voPbW6r4C/EkHtb9K8zZpHc1UzPeB94/oub+Z7k7TuprmFMB1NC8uVwFv6qj2B4B/Bl6i\nCZvTO36cf793fB3cYc29aAZQjwFraT5c+jSwW0f1/xh4uPd8PwV8AdinVj3Xg5WkSmbdHKwkTQoD\nVpIqMWAlqRIDVpIqMWAlqRIDVpIqMWAlqRIDVpIqMWAlqRIDVpIqMWAlqZL/D0AIhd//PmPsAAAA\nAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f2c02433c50>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "correct = numpy.sum(numpy.argmax(predictions, 1) == numpy.argmax(batch_labels, 1))\n",
    "total = predictions.shape[0]\n",
    "\n",
    "print(float(correct) / float(total))\n",
    "\n",
    "confusions = numpy.zeros([10, 10], numpy.float32)\n",
    "bundled = zip(numpy.argmax(predictions, 1), numpy.argmax(batch_labels, 1))\n",
    "for predicted, actual in bundled:\n",
    "  confusions[predicted, actual] += 1\n",
    "\n",
    "plt.grid(False)\n",
    "plt.xticks(numpy.arange(NUM_LABELS))\n",
    "plt.yticks(numpy.arange(NUM_LABELS))\n",
    "plt.imshow(confusions, cmap=plt.cm.jet, interpolation='nearest');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "iZmx_9DiDXQ3"
   },
   "source": [
    "Now let's wrap this up into our scoring function."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2016-09-16T14:49:29.857607",
     "start_time": "2016-09-16T14:49:29.843904"
    },
    "cellView": "both",
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0
     },
     "output_extras": [
      {
       "item_id": 1
      }
     ]
    },
    "colab_type": "code",
    "collapsed": false,
    "executionInfo": {
     "elapsed": 178,
     "status": "ok",
     "timestamp": 1446751995007,
     "user": {
      "color": "#1FA15D",
      "displayName": "Michael Piatek",
      "isAnonymous": false,
      "isMe": true,
      "permissionId": "00327059602783983041",
      "photoUrl": "//lh6.googleusercontent.com/-wKJwK_OPl34/AAAAAAAAAAI/AAAAAAAAAlk/Rh3u6O2Z7ns/s50-c-k-no/photo.jpg",
      "sessionId": "716a6ad5e180d821",
      "userId": "106975671469698476657"
     },
     "user_tz": 480
    },
    "id": "DPJie7bPDaLa",
    "outputId": "a06c64ed-f95f-416f-a621-44cccdaba0f8"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Done\n"
     ]
    }
   ],
   "source": [
    "def error_rate(predictions, labels):\n",
    "    \"\"\"Return the error rate and confusions.\"\"\"\n",
    "    correct = numpy.sum(numpy.argmax(predictions, 1) == numpy.argmax(labels, 1))\n",
    "    total = predictions.shape[0]\n",
    "\n",
    "    error = 100.0 - (100 * float(correct) / float(total))\n",
    "\n",
    "    confusions = numpy.zeros([10, 10], numpy.float32)\n",
    "    bundled = zip(numpy.argmax(predictions, 1), numpy.argmax(labels, 1))\n",
    "    for predicted, actual in bundled:\n",
    "        confusions[predicted, actual] += 1\n",
    "    \n",
    "    return error, confusions\n",
    "\n",
    "print('Done')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "sLv22cjeB5Rd"
   },
   "source": [
    "We'll need to train for some time to actually see useful predicted values. Let's define a loop that will go through our data. We'll print the loss and error periodically.\n",
    "\n",
    "Here, we want to iterate over the entire data set rather than just the first batch, so we'll need to slice the data to that end.\n",
    "\n",
    "(One pass through our training set will take some time on a CPU, so be patient if you are executing this notebook.)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2016-09-16T14:53:26.998313",
     "start_time": "2016-09-16T14:49:29.860079"
    },
    "cellView": "both",
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0
     }
    },
    "colab_type": "code",
    "collapsed": false,
    "id": "4cgKJrS1_vej"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Step 0 of 916\n",
      "Mini-batch loss: 7.71263 Error: 91.66667 Learning rate: 0.01000\n",
      "Validation error: 88.9%\n",
      "Step 100 of 916\n",
      "Mini-batch loss: 3.32480 Error: 10.00000 Learning rate: 0.01000\n",
      "Validation error: 6.0%\n",
      "Step 200 of 916\n",
      "Mini-batch loss: 3.30628 Error: 11.66667 Learning rate: 0.01000\n",
      "Validation error: 3.7%\n",
      "Step 300 of 916\n",
      "Mini-batch loss: 3.16925 Error: 5.00000 Learning rate: 0.01000\n",
      "Validation error: 3.3%\n",
      "Step 400 of 916\n",
      "Mini-batch loss: 3.06869 Error: 3.33333 Learning rate: 0.01000\n",
      "Validation error: 2.5%\n",
      "Step 500 of 916\n",
      "Mini-batch loss: 2.99121 Error: 0.00000 Learning rate: 0.01000\n",
      "Validation error: 2.6%\n",
      "Step 600 of 916\n",
      "Mini-batch loss: 3.07648 Error: 5.00000 Learning rate: 0.01000\n",
      "Validation error: 2.1%\n",
      "Step 700 of 916\n",
      "Mini-batch loss: 3.15329 Error: 8.33333 Learning rate: 0.01000\n",
      "Validation error: 2.1%\n",
      "Step 800 of 916\n",
      "Mini-batch loss: 3.12467 Error: 6.66667 Learning rate: 0.01000\n",
      "Validation error: 1.8%\n",
      "Step 900 of 916\n",
      "Mini-batch loss: 2.85096 Error: 0.00000 Learning rate: 0.01000\n",
      "Validation error: 1.8%\n"
     ]
    }
   ],
   "source": [
    "# Train over the first 1/4th of our training set.\n",
    "steps = train_size // BATCH_SIZE\n",
    "for step in range(steps):\n",
    "    # Compute the offset of the current minibatch in the data.\n",
    "    # Note that we could use better randomization across epochs.\n",
    "    offset = (step * BATCH_SIZE) % (train_size - BATCH_SIZE)\n",
    "    batch_data = train_data[offset:(offset + BATCH_SIZE), :, :, :]\n",
    "    batch_labels = train_labels[offset:(offset + BATCH_SIZE)]\n",
    "    # This dictionary maps the batch data (as a numpy array) to the\n",
    "    # node in the graph it should be fed to.\n",
    "    feed_dict = {train_data_node: batch_data,\n",
    "                 train_labels_node: batch_labels}\n",
    "    # Run the graph and fetch some of the nodes.\n",
    "    _, l, lr, predictions = s.run(\n",
    "      [optimizer, loss, learning_rate, train_prediction],\n",
    "      feed_dict=feed_dict)\n",
    "    \n",
    "    # Print out the loss periodically.\n",
    "    if step % 100 == 0:\n",
    "        error, _ = error_rate(predictions, batch_labels)\n",
    "        print('Step %d of %d' % (step, steps))\n",
    "        print('Mini-batch loss: %.5f Error: %.5f Learning rate: %.5f' % (l, error, lr))\n",
    "        print('Validation error: %.1f%%' % error_rate(\n",
    "              validation_prediction.eval(), validation_labels)[0])\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "J4LskgGXIDAm"
   },
   "source": [
    "The error seems to have gone down. Let's evaluate the results using the test set.\n",
    "\n",
    "To help identify rare mispredictions, we'll include the raw count of each (prediction, label) pair in the confusion matrix."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2016-09-16T14:55:10.942063",
     "start_time": "2016-09-16T14:53:26.999971"
    },
    "cellView": "both",
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0
     },
     "output_extras": [
      {
       "item_id": 1
      },
      {
       "item_id": 2
      }
     ]
    },
    "colab_type": "code",
    "collapsed": false,
    "executionInfo": {
     "elapsed": 436,
     "status": "ok",
     "timestamp": 1446752934104,
     "user": {
      "color": "#1FA15D",
      "displayName": "Michael Piatek",
      "isAnonymous": false,
      "isMe": true,
      "permissionId": "00327059602783983041",
      "photoUrl": "//lh6.googleusercontent.com/-wKJwK_OPl34/AAAAAAAAAAI/AAAAAAAAAlk/Rh3u6O2Z7ns/s50-c-k-no/photo.jpg",
      "sessionId": "716a6ad5e180d821",
      "userId": "106975671469698476657"
     },
     "user_tz": 480
    },
    "id": "6Yh1jGFuIKc_",
    "outputId": "4e411de4-0fe2-451b-e4ca-8a4854f0db89"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Test error: 2.0%\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n2znnMuR/t5D3+yEP4EgAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f2c0217a510>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "test_error, confusions = error_rate(test_prediction.eval(), test_labels)\n",
    "print('Test error: %.1f%%' % test_error)\n",
    "\n",
    "plt.xlabel('Actual')\n",
    "plt.ylabel('Predicted')\n",
    "plt.grid(False)\n",
    "plt.xticks(numpy.arange(NUM_LABELS))\n",
    "plt.yticks(numpy.arange(NUM_LABELS))\n",
    "plt.imshow(confusions, cmap=plt.cm.jet, interpolation='nearest');\n",
    "\n",
    "for i, cas in enumerate(confusions):\n",
    "    for j, count in enumerate(cas):\n",
    "        if count > 0:\n",
    "            xoff = .07 * len(str(count))\n",
    "            plt.text(j-xoff, i+.2, int(count), fontsize=9, color='white')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "yLnS4dGiMwI1"
   },
   "source": [
    "We can see here that we're mostly accurate, with some errors you might expect, e.g., '9' is often confused as '4'.\n",
    "\n",
    "Let's do another sanity check to make sure this matches roughly the distribution of our test set, e.g., it seems like we have fewer '5' values."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2016-09-16T14:55:18.083458",
     "start_time": "2016-09-16T14:55:17.830485"
    },
    "cellView": "both",
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0
     },
     "output_extras": [
      {
       "item_id": 1
      }
     ]
    },
    "colab_type": "code",
    "collapsed": false,
    "executionInfo": {
     "elapsed": 352,
     "status": "ok",
     "timestamp": 1446753006584,
     "user": {
      "color": "#1FA15D",
      "displayName": "Michael Piatek",
      "isAnonymous": false,
      "isMe": true,
      "permissionId": "00327059602783983041",
      "photoUrl": "//lh6.googleusercontent.com/-wKJwK_OPl34/AAAAAAAAAAI/AAAAAAAAAlk/Rh3u6O2Z7ns/s50-c-k-no/photo.jpg",
      "sessionId": "716a6ad5e180d821",
      "userId": "106975671469698476657"
     },
     "user_tz": 480
    },
    "id": "x5KOv1AJMgzV",
    "outputId": "2acdf737-bab6-408f-8b3c-05fa66d04fe6"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nG1beKa9dAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f841c174f60>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.xticks(numpy.arange(NUM_LABELS))\n",
    "plt.hist(numpy.argmax(test_labels, 1));"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "E6DzLSK5M1ju"
   },
   "source": [
    "Indeed, we appear to have fewer 5 labels in the test set. So, on the whole, it seems like our model is learning and our early results are sensible.\n",
    "\n",
    "But, we've only done one round of training. We can greatly improve accuracy by training for longer. To try this out, just re-execute the training cell above."
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "colab": {
   "default_view": {},
   "name": "Untitled",
   "provenance": [],
   "version": "0.3.2",
   "views": {}
  },
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
